This is Kara’s response to an email from Tanya from Asilomar (2019-05-07), post-conference, using Packet 7 data (with data from 2019-03-18). (Note: PDF printed portrait, 80% zoom, minimum margins.)
Questions from TML email:
- Does DSE 4, 5, 13, 14, 15 [the least spiritual events] hang together with Spiritual Events and does porosity predict it?
- Spiritual Events (three groups: 14, 15, 26, then 17, 18, 19, then 20, 21, then all these together)—do these correlate less with porosity than 1-13 from that scale?
- Do these items from the Dulin scale (2, 3, 16, 17, the less personified events) correlate differently with spiritual events than the other items considered as a group?
- Can we sum Martha Mary 1b, 1e, 2b, 2e, 3b, 3e and see whether these “pure” porosity events still predict spiritual events?
- Are there highly religious people (as marked in demographics) who do not endorse porosity highly and the reverse? e.g., can we plot the how spiritual/religious against Martha Mary and also against Dulin?
- Plot highly religious people against the DSE and against the Spiritual Events scale?
I’ll try to address each in turn!
Question #1: Focusing on the least spiritual experiences from Daily Spiritual Experiences scale
Tanya’s question: Does DSE 4, 5, 13, 14, 15 [the least spiritual events] hang together with Spiritual Events and does porosity predict it?
I’ll start by looking at correlations between the subset of “less spiritual” DSE items, the Spiritual Events total score, and the Porosity (Dulin) total score. I’ll also include the relevant correlations with the “more spiritual” DSE items and the DSE total score as points of reference.

Correlations with Spiritual Events:
- The subset of less spiritual DSE items was strongly correlated with the Spiritual Events total score (r = 0.58, 95% CI: [0.53, 0.61], p = 0).
- Numerically speaking, this correlation appears to be somewhat weaker than the correlation between the subset of more spiritual DSE items and Spiritual Events (r = 0.69, 95% CI: [0.65, 0.73], p = 0).
Correlations with Porosity:
- The subset of less spiritual DSE items was strongly correlated with the Porosity (Dulin) total score (r = 0.58, 95% CI: [0.53, 0.63], p = 0).
- Numerically speaking, this correlation appears to be somewhat weaker than the correlation between the subset of more spiritual DSE items and Porosity (Dulin) (r = 0.66, 95% CI: [0.61, 0.73], p = 0).
However, are these meaningful differences? One important thing to keep in mind is that the reliability of a scale (how strongly its items are correlated with each other) affects how strongly correlated the total scale can be with other measures. A rough rule of thumb is that the reliability of a scale sets an upper bound for the correlation between that scale and others. Since these two subsets of DSE are kind of ad-hoc (and definitely post-hoc) breakdowns of a pre-existing scale, this seems especially important to check here.
With this in mind, let’s check the reliability of the two subsets of the DSE scale, and look at how these correlations with Spiritual Events and Porosity (Dulin) stack up to the upper limit imposed by reliability… and just for fun I’ll throw in the correlations within each site as well.


The solid dots in these plots illustrate that the subset of less spiritual DSE items (center panel) formed a generally less reliable “scale” than the subset of more spiritual DSE items (rightmost). This has the important consequence of forcing the correlation between the less spiritual items and the Spiritual Events scale in some sense to be weaker.
Given this, what I’m interested in is whether the distance between the cross-hatch (the correlation coefficient between that scale and Spiritual Events, in the first plot; or between that scale and Porosity (Dulin), in the second plot) and the solid dot (the reliability of that scale) differs across the panels. If this distance were greater for the subset of less spirtiual DSE items, this would strengthen my belief that these items were meaningfully less strongly related to Spiritual Events/Porosity - but that’s not really what I see here in either case. Instead, if you think of reliability as an upper limit for correlation, the differences between correlations starts to look like an artifact of differences in reliability.
KARA’S CURRENT TAKE-AWAY: Both less spiritual and more spiritual DSE items were strongly correlated with Spiritual Events, and with Porosity. These relationships were somewhat weaker for the less spiritual DSE items, but I’m not sure these differences were meaningful—they might well be an artifact of underlying differences in reliability across the two subsets of DSE items.
Question #2: Focusing on different sets of spiritual events from the Spiritual Events scale
Tanya’s question: Spiritual Events (three groups: 14, 15, 26, then 17, 18, 19, then 20, 21, then all these together)—do these correlate less with porosity than 1-13 from that scale?
NOTES:
- In Packet 7, the Spiritual Events scale only included 23 items (no question #26), and I suspect you might have meant 16 instead, so I went with this for now. - I also want to point out that this grouping (1-13 vs. 14-21) leaves out questions 22-23.
- Given my concerns about reliability, I’m going to start with the coarsest grouping - comparing a 3-item “scale” with a 13-item scale could really obscure what’s going on here. We can come back to this and discuss more!
I’ll start by looking at correlations between SE items #14-21, SE items #1-13 and the Porosity (Dulin) total score. I’ll also include the relevant correlations with the SE total score as a point of reference.

Correlations with Porosity:
- The highlighted subset of SE items (#14-21) was strongly correlated with the Porosity (Dulin) total score (r = 0.49, 95% CI: [0.42, 0.55], p = 0).
- Numerically speaking, this correlation appears to be somewhat weaker than the correlation between the other subset of SE items (#1-13) and Porosity (Dulin) (r = 0.57, 95% CI: [0.52, 0.62], p = 0).
However, is this a meaningful difference? To repeat from Question #1, above: an important thing to keep in mind is that the reliability of a scale (how strongly its items are correlated with each other) affects how strongly correlated the total scale can be with other measures. A rough rule of thumb is that the reliability of a scale sets an upper bound for the correlation between that scale and others. Since these two subsets of SE are kind of ad-hoc (and definitely post-hoc) breakdowns of a pre-existing scale, this seems especially important to check here.
With this in mind, let’s check the reliability of the two subsets of the SE scale, and look at how these correlations with Porosity (Dulin) stack up to the upper limit imposed by reliability… and just for fun I’ll throw in the correlations within each site as well.

The solid dots in these plots illustrate that SE items #14-21 (rightmost panel) formed a generally less reliable “scale” than SE items #1-13 (center)—not surprising, since shorter scales are generally less reliable. This has the important consequence of forcing the correlation between items #14-21 and the Porosity (Dulin) scale in some sense to be weaker.
Given this, what I’m interested in is whether the distance between the cross-hatch (the correlation coefficient between that scale and Porosity (Dulin)) and the solid dot (the reliability of that scale) differs across the panels. If this distance were greater for SE items #14-21, this would strengthen my belief that these items were meaningfully less strongly related to Porosity - but that’s not really what I see here. Instead, if you think of reliability as an upper limit for correlation, the differences between correlations starts to look like an artifact of differences in reliability.
KARA’S CURRENT TAKE-AWAY: Both subsets of SE items were strongly correlated with Porosity. These relationships were slightly weaker for SE items #14-21, but I’m not sure these differences were meaningful—they might well be an artifact of underlying differences in reliability across the two subsets of SE items.
Question #3: Focusing on the less personified events from the Porosity (Dulin) scale
Tanya’s question: Do these items from the Dulin scale (2, 3, 16, 17, the less personified events) correlate differently with spiritual events than the other items considered as a group?
I’ll start by looking at correlations between the less personified Porosity items, the more personified Porosity items and the Spiritual Events total score. I’ll also include the relevant correlations with the Porosity total score as a point of reference.

__Correlations with Spiritual Events_:
- The less personified subest of Porosity items was moderately correlated with the Spiritual Events total score (r = 0.41, 95% CI: [0.33, 0.48], p = 0).
- Numerically speaking, this correlation appears to be weaker than the correlation between the other subset of SE items (#1-13) and Porosity (Dulin) (r = 0.58, 95% CI: [0.53, 0.63], p = 0).
However, is this a meaningful difference? To repeat from Questions #1-2, above: an important thing to keep in mind is that the reliability of a scale (how strongly its items are correlated with each other) affects how strongly correlated the total scale can be with other measures. A rough rule of thumb is that the reliability of a scale sets an upper bound for the correlation between that scale and others. Since these two subsets of Porosity are kind of ad-hoc (and definitely post-hoc) breakdowns of a pre-existing scale, this seems especially important to check here.
With this in mind, let’s check the reliability of the two subsets of the Porosity scale, and look at how these correlations with Spiritual Events stack up to the upper limit imposed by reliability… and just for fun I’ll throw in the correlations within each site as well.

The solid dots in these plots illustrate that the less personified Porosity items (rightmost panel) formed a generally much less reliable “scale” than the more personified Porosity items (center)—not surprising, since shorter scales are generally less reliable. This has the important consequence of forcing the correlation between the less personified items and the Spiritual Events scale in some sense to be weaker.
Given this, what I’m interested in is whether the distance between the cross-hatch (the correlation coefficient between that scale and Spirtual Events) and the solid dot (the reliability of that scale) differs across the panels. If this distance were greater for the less personified Porosity items, this would strengthen my belief that these items were meaningfully less strongly related to Spiritual Events - but that’s not really what I see here. Instead, if you think of reliability as an upper limit for correlation, the differences between correlations starts to look like an artifact of differences in reliability. (If anything, the reverse might be true - these items might be closer to the ceiling for correlation?)
KARA’S CURRENT TAKE-AWAY: Both subsets of Porosity items were correlated with Spiritual Events. These relationships were weaker for the less personified Porosity items, but I’m not sure these differences were meaningful—they might well be an artifact of underlying differences in reliability across the two subsets of Porosity items.
Question #4: Focusing on the purest porosity events from the Martha Story scale
Tanya’s question: Can we sum Martha Mary 1b, 1e, 2b, 2e, 3b, 3e and see whether these “pure” porosity events still predict spiritual events?
BOOKMARK
I’ll start by looking at correlations between the pure Martha Story items, the other Martha Story items and the Spiritual Events total score. I’ll also include the relevant correlations with the Martha Story total score as a point of reference.

__Correlations with Spiritual Events_:
- The pure subest of Martha Story items was moderately correlated with the Spiritual Events total score (r = 0.49, 95% CI: [NA, NA], p = NA).
- Numerically speaking, this correlation appears to be identical to the correlation between the other subset of SE items (#1-13) and Martha Story (r = 0.5, 95% CI: [NA, NA], p = NA).
However, is this a meaningful similarity? To repeat from Questions #1-2, above: an important thing to keep in mind is that the reliability of a scale (how strongly its items are correlated with each other) affects how strongly correlated the total scale can be with other measures. A rough rule of thumb is that the reliability of a scale sets an upper bound for the correlation between that scale and others. Since these two subsets of Martha Story are kind of ad-hoc (and definitely post-hoc) breakdowns of a pre-existing scale, this seems especially important to check here.
With this in mind, let’s check the reliability of the two subsets of the Martha Story scale, and look at how these correlations with Spiritual Events stack up to the upper limit imposed by reliability… and just for fun I’ll throw in the correlations within each site as well.

The solid dots in these plots illustrate that the pure Martha Story items (rightmost panel) and the other Martha Story items (center) formed roughly equally reliable “scales.” Thus, in principle, correlations with Spiritual Events could be equally strong for the two subsets of Martha Story items.
In this light, I feel pretty confidence saying that the “pure” Martha Story items were just as good at “predicting” Spiritual Events as were the other Martha Story items.
KARA’S CURRENT TAKE-AWAY: Both subsets of Martha Story items were equally correlated with Spiritual Events.
Question #5: Focusing religiosity & porosity
Tanya’s question: Are there highly religious people (as marked in demographics) who do not endorse porosity highly and the reverse? e.g., can we plot the how spiritual/religious against Martha Mary and also against Dulin?
To address this, I’ll plot self-reported religiosity against scores on both porosity measures.


We’re looking for two things here:
- Participants who scored high on religiosity but low on porosity (i.e., points in the lower right corner).
- People who scored low on religiosity but high on porosity (i.e., points in the upper left corner).
I’ve boxed off the regions that would contain (1) participants who scored 2 on religiosity and <= 25% of the total possible score for porosity, and (2) participants who scored -2 for religiosity and >= 75% of the total posible score for porosity. There are very few participants in these regions in any site.
Number of participants with unusual combinations of religiosity and porosity scores. 'High' corresponds to scores >= 25% of the total possible score; 'low' corresponds to scores <= 25% of the total possible score.
| Site |
High religiosity, low Porosity (Dulin) |
High religiosity, low Martha Story |
Low religiosity, high Porosity (Dulin) |
Low religiosity, high Martha Story |
| US |
2 (0.5%) |
3 (0.7%) |
0 |
0 |
| Ghana |
4 (1%) |
6 (1.5%) |
0 |
0 |
| Thailand |
0 |
1 (0.2%) |
0 |
0 |
| China |
0 |
0 |
0 |
0 |
| Vanuatu |
0 |
1 (0.3%) |
0 |
0 |
Rather than setting arbitrary cutoffs of +/-2 on religiosity and <=25% or >=75% of the total possible score for porosity, we could also look at “outliers” who scored a certain amount away from the mean on these measures. I’ll do this through standardization - first, collapsing across sites; then, within each site individually.

Parallel to above, I’ve boxed off the regions that would contain (1) participants who scored >= 1 standard deviation above the mean for religiosity and <= 1 standard deviation below the mean for porosity, and (2) participants who scored <= 1 standard deviation below the mean for religiosity and >= 1 standard deviation above the mean for porosity. There are very few participants in these regions in any site.
Number of participants with unusual combinations of religiosity and porosity scores (standardizing collapsing across sites). 'High' corresponds to scores >=1 standard deviation above the mean (collapsing across sites); 'low' corresponds to scores <= 1 standard deviation below the mean (collapsing across sites).
| Site |
High religiosity, low Porosity (Dulin) |
High religiosity, low Martha Story |
Low religiosity, high Porosity (Dulin) |
Low religiosity, high Martha Story |
| US |
0 |
1 (0.2%) |
0 |
3 (0.7%) |
| Ghana |
3 (0.8%) |
2 (0.5%) |
1 (0.2%) |
1 (0.2%) |
| Thailand |
0 |
0 |
0 |
0 |
| China |
0 |
0 |
0 |
1 (0.2%) |
| Vanuatu |
0 |
0 |
0 |
0 |
What if we standardize within each site, such that we’re looking for participants who scored relatively higher/lower compared to other people in that site?

Parallel to the previous plot, I’ve boxed off the regions that would contain (1) participants who scored >= 1 standard deviation above the mean for that site for religiosity and <= 1 standard deviation below the mean for that site for porosity, and (2) participants who scored <= 1 standard deviation below the mean for that site for religiosity and >= 1 standard deviation above the mean for that site for porosity. There are very few participants in these regions in any site.
Number of participants with unusual combinations of religiosity and porosity scores (standardizing within each site). 'High' corresponds to scores >=1 standard deviation above the mean (for that site); 'low' corresponds to scores <= 1 standard deviation below the mean (for that site).
| Site |
High religiosity, low Porosity (Dulin) |
High religiosity, low Martha Story |
Low religiosity, high Porosity (Dulin) |
Low religiosity, high Martha Story |
| US |
0 |
0 |
1 (0.2%) |
2 (0.5%) |
| Ghana |
6 (1.5%) |
6 (1.5%) |
1 (0.2%) |
2 (0.5%) |
| Thailand |
0 |
0 |
0 |
0 |
| China |
2 (0.5%) |
3 (0.8%) |
1 (0.2%) |
1 (0.2%) |
| Vanuatu |
1 (0.3%) |
2 (0.5%) |
4 (1.1%) |
2 (0.5%) |
KARA’S CURRENT TAKE-AWAY: No matter how we look at it, there were just a handful of people (<2% in any site) who bucked the general trend that endorsements of porosity are positively related to self-reported religiosity.
Question #6: Focusing on highly religious people & spiritual experience
Tanya’s question: Plot highly religious people against the DSE and against the Spiritual Events scale?
NOTE: I’m assuming that this means to do something similar to Question #5, but I’m not sure if that was the intention.
To address this, I’ll plot self-reported religiosity against scores on both spiritual experience measures.


We’re looking for two things here:
- Participants who scored high on religiosity but low on spiritual experience (i.e., points in the lower right corner).
- People who scored low on religiosity but high on spiritual experience (i.e., points in the upper left corner).
I’ve boxed off the regions that would contain (1) participants who scored 2 on religiosity and <= 25% of the total possible score for spiritual experience, and (2) participants who scored -2 for religiosity and >= 75% of the total posible score for spiritual experience. There are very few participants in these regions in any site.
Number of participants with unusual combinations of religiosity and spiritual experience scores. 'High' corresponds to scores >= 25% of the total possible score; 'low' corresponds to scores <= 25% of the total possible score.
| Site |
High religiosity, low DSE |
High religiosity, low SE |
Low religiosity, high DSE |
Low religiosity, high SE |
| US |
0 |
6 (1.5%) |
0 |
0 |
| Ghana |
0 |
10 (2.5%) |
0 |
0 |
| Thailand |
1 (0.2%) |
1 (0.2%) |
0 |
0 |
| China |
0 |
0 |
0 |
0 |
| Vanuatu |
0 |
7 (1.9%) |
0 |
0 |
Rather than setting arbitrary cutoffs of +/-2 on religiosity and <=25% or >=75% of the total possible score for spiritual experience, we could also look at “outliers” who scored a certain amount away from the mean on these measures. I’ll do this through standardization - first, collapsing across sites; then, within each site individually.

Parallel to above, I’ve boxed off the regions that would contain (1) participants who scored >= 1 standard deviation above the mean for religiosity and <= 1 standard deviation below the mean for spiritual experience, and (2) participants who scored <= 1 standard deviation below the mean for religiosity and >= 1 standard deviation above the mean for spiritual experience. There are virtually no participants in these regions in any site.
Number of participants with unusual combinations of religiosity and spiritual experience scores (standardizing collapsing across sites). 'High' corresponds to scores >=1 standard deviation above the mean (collapsing across sites); 'low' corresponds to scores <= 1 standard deviation below the mean (collapsing across sites).
| Site |
High religiosity, low DSE |
High religiosity, low SE |
Low religiosity, high DSE |
Low religiosity, high SE |
| US |
0 |
0 |
0 |
0 |
| Ghana |
0 |
2 (0.5%) |
1 (0.2%) |
0 |
| Thailand |
1 (0.2%) |
0 |
0 |
0 |
| China |
0 |
0 |
0 |
0 |
| Vanuatu |
0 |
0 |
0 |
0 |
What if we standardize within each site, such that we’re looking for participants who scored relatively higher/lower compared to other people in that site?

Parallel to the previous plot, I’ve boxed off the regions that would contain (1) participants who scored >= 1 standard deviation above the mean for that site for religiosity and <= 1 standard deviation below the mean for that site for spiritual experience, and (2) participants who scored <= 1 standard deviation below the mean for that site for religiosity and >= 1 standard deviation above the mean for that site for spiritual experience. There are very few participants in these regions in any site.
Number of participants with unusual combinations of religiosity and spiritual experience scores (standardizing within each site). 'High' corresponds to scores >=1 standard deviation above the mean (for that site); 'low' corresponds to scores <= 1 standard deviation below the mean (for that site).
| Site |
High religiosity, low DSE |
High religiosity, low SE |
Low religiosity, high DSE |
Low religiosity, high SE |
| US |
0 |
0 |
0 |
0 |
| Ghana |
0 |
5 (1.2%) |
2 (0.5%) |
2 (0.5%) |
| Thailand |
1 (0.2%) |
0 |
0 |
0 |
| China |
1 (0.2%) |
2 (0.5%) |
1 (0.2%) |
1 (0.2%) |
| Vanuatu |
3 (0.8%) |
2 (0.5%) |
1 (0.3%) |
3 (0.8%) |
KARA’S CURRENT TAKE-AWAY: No matter how we look at it, there were just a handful of people (<3% in any site) who bucked the general trend that endorsements of spiritual experience are positively related to self-reported religiosity.
LS0tCnRpdGxlOiAiUGFja2V0IDcgKEtXIGFkZHJlc3NpbmcgcXVlc3Rpb25zIHJhaXNlZCBhdCBBc2lsb21hcikiCnN1YnRpdGxlOiAiTGFzdCB1cGRhdGVkOiAyMDE5LTA1LTA4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgpUaGlzIGlzIEthcmEncyByZXNwb25zZSB0byBhbiBlbWFpbCBmcm9tIFRhbnlhIGZyb20gQXNpbG9tYXIgKDIwMTktMDUtMDcpLCBwb3N0LWNvbmZlcmVuY2UsIHVzaW5nIFBhY2tldCA3IGRhdGEgKHdpdGggZGF0YSBmcm9tIDIwMTktMDMtMTgpLiAoTm90ZTogUERGIHByaW50ZWQgcG9ydHJhaXQsIDgwJSB6b29tLCBtaW5pbXVtIG1hcmdpbnMuKQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNjcsCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gRiwgZWNobyA9IEYpCmBgYAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGxhbmdjb2cpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCmBgYHtyfQpzb3VyY2UoIi4vc2NyaXB0cy9wN19kYXRhX3ByZXAuUiIpCmBgYAoKUXVlc3Rpb25zIGZyb20gVE1MIGVtYWlsOgoKMS4gRG9lcyBEU0UgNCwgNSwgMTMsIDE0LCAxNSAgW3RoZSBsZWFzdCBzcGlyaXR1YWwgZXZlbnRzXSBoYW5nIHRvZ2V0aGVyIHdpdGggU3Bpcml0dWFsIEV2ZW50cyBhbmQgZG9lcyBwb3Jvc2l0eSBwcmVkaWN0IGl0PwoyLiBTcGlyaXR1YWwgRXZlbnRzICh0aHJlZSBncm91cHM6IDE0LCAxNSwgMjYsIHRoZW4gMTcsIDE4LCAxOSwgdGhlbiAyMCwgMjEsIHRoZW4gYWxsIHRoZXNlIHRvZ2V0aGVyKeKAlGRvIHRoZXNlIGNvcnJlbGF0ZSBsZXNzIHdpdGggcG9yb3NpdHkgdGhhbiAxLTEzIGZyb20gdGhhdCBzY2FsZT8KMy4gRG8gdGhlc2UgaXRlbXMgZnJvbSB0aGUgRHVsaW4gc2NhbGUgKDIsIDMsIDE2LCAxNywgdGhlIGxlc3MgcGVyc29uaWZpZWQgZXZlbnRzKSBjb3JyZWxhdGUgZGlmZmVyZW50bHkgd2l0aCBzcGlyaXR1YWwgZXZlbnRzIHRoYW4gdGhlIG90aGVyIGl0ZW1zIGNvbnNpZGVyZWQgYXMgYSBncm91cD8KNC4gQ2FuIHdlIHN1bSBNYXJ0aGEgTWFyeSAxYiwgMWUsIDJiLCAyZSwgM2IsIDNlIGFuZCBzZWUgd2hldGhlciB0aGVzZSDigJxwdXJl4oCdIHBvcm9zaXR5IGV2ZW50cyBzdGlsbCBwcmVkaWN0IHNwaXJpdHVhbCBldmVudHM/CjUuIEFyZSB0aGVyZSBoaWdobHkgcmVsaWdpb3VzIHBlb3BsZSAoYXMgbWFya2VkIGluIGRlbW9ncmFwaGljcykgd2hvIGRvIG5vdCBlbmRvcnNlIHBvcm9zaXR5IGhpZ2hseSBhbmQgdGhlIHJldmVyc2U/IGUuZy4sIGNhbiB3ZSBwbG90IHRoZSBob3cgc3Bpcml0dWFsL3JlbGlnaW91cyBhZ2FpbnN0IE1hcnRoYSBNYXJ5IGFuZCBhbHNvIGFnYWluc3QgRHVsaW4/IAo2LiBQbG90IGhpZ2hseSByZWxpZ2lvdXMgcGVvcGxlIGFnYWluc3QgdGhlIERTRSBhbmQgYWdhaW5zdCB0aGUgU3Bpcml0dWFsIEV2ZW50cyBzY2FsZT8KCkknbGwgdHJ5IHRvIGFkZHJlc3MgZWFjaCBpbiB0dXJuIQoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyBRdWVzdGlvbiAjMTogRm9jdXNpbmcgb24gdGhlIGxlYXN0IHNwaXJpdHVhbCBleHBlcmllbmNlcyBmcm9tIERhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyBzY2FsZQoKVGFueWEncyBxdWVzdGlvbjogX0RvZXMgRFNFIDQsIDUsIDEzLCAxNCwgMTUgIFt0aGUgbGVhc3Qgc3Bpcml0dWFsIGV2ZW50c10gaGFuZyB0b2dldGhlciB3aXRoIFNwaXJpdHVhbCBFdmVudHMgYW5kIGRvZXMgcG9yb3NpdHkgcHJlZGljdCBpdD9fCgpgYGB7cn0KZF9xMSA8LSBkMCAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgY29udGFpbnMoIl9kc2VfIikpICU+JQogIHNlbGVjdCgtY29udGFpbnMoInRvdGFsIiksIC1jb250YWlucygiY2hlY2siKSwgLWVuZHNfd2l0aCgiX2NhdCIpKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCBjb250YWlucygiX2RzZV8iKSkgJT4lCiAgbXV0YXRlKGRzZV9wYXJ0ID0gY2FzZV93aGVuKAogICAgcXVlc3Rpb24gJWluJSBjKCJwN19kc2Vfc3BpLnN0cmVuZ3RoIiwgInA3X2RzZV9zcGlydC5jb21mb3J0IiwgIyBxNC01CiAgICAgICAgICAgICAgICAgICAgInA3X2RzZV9ibGVzc2luZ3MiLCAicDdfZHNlX3NlbGZsZXNzLmNhcmUiLCAjIHExMy0xNAogICAgICAgICAgICAgICAgICAgICJwN19kc2VfYWNjZXB0Lndyb25nIikgfiAicDdfZHNlX3RvdGFsX2xlc3MiLCAjIHExNQogICAgVFJVRSB+ICJwN19kc2VfdG90YWxfbW9yZSIpKSAlPiUgCiAgZ3JvdXBfYnkocDdfY3RyeSwgcDdfc3ViaiwgZHNlX3BhcnQpICU+JQogIHN1bW1hcmlzZShzY29yZSA9IHN1bShyZXNwb25zZSwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNwcmVhZChkc2VfcGFydCwgc2NvcmUpICU+JQogIGxlZnRfam9pbihkMCAlPiUgc2VsZWN0KHA3X3N1YmosIGNvbnRhaW5zKCJ0b3RhbCIpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLWMocDdfY3RyeSwgcDdfc3ViaikpLCBmdW5zKGFzLm51bWVyaWMpKSAlPiUKICBnYXRoZXIoc2NhbGUsIHNjb3JlLCAtYyhwN19jdHJ5LCBwN19zdWJqKSkgJT4lCiAgZ3JvdXBfYnkoc2NhbGUpICU+JQogIG11dGF0ZShzY29yZV9zdGQgPSBzY2FsZShzY29yZSwgc2NhbGUgPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KHNjYWxlLCBwN19jdHJ5KSAlPiUKICBtdXRhdGUoc2NvcmVfc3RkX2J5c2l0ZSA9IHNjYWxlKHNjb3JlLCBzY2FsZSA9IFQpKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpJJ2xsIHN0YXJ0IGJ5IGxvb2tpbmcgYXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIHN1YnNldCBvZiAibGVzcyBzcGlyaXR1YWwiIERTRSBpdGVtcywgdGhlIFNwaXJpdHVhbCBFdmVudHMgdG90YWwgc2NvcmUsIGFuZCB0aGUgUG9yb3NpdHkgKER1bGluKSB0b3RhbCBzY29yZS4gSSdsbCBhbHNvIGluY2x1ZGUgdGhlIHJlbGV2YW50IGNvcnJlbGF0aW9ucyB3aXRoIHRoZSAibW9yZSBzcGlyaXR1YWwiIERTRSBpdGVtcyBhbmQgdGhlIERTRSB0b3RhbCBzY29yZSBhcyBwb2ludHMgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjgsIGluY2x1ZGUgPSBUfQojIGNvcnJlbGF0aW9ucyB3aXRob3V0IHN0YW5kYXJkaXppbmc6CmNvcl9xMSA8LSBkX3ExICU+JQogIGZpbHRlcihncmVwbCgiX2RzZV8iLCBzY2FsZSkgfCBncmVwbCgiX3NlXyIsIHNjYWxlKSB8IAogICAgICAgICAgIGdyZXBsKCJfcG9yXyIsIHNjYWxlKSkgJT4lCiAgc2VsZWN0KHA3X3N1YmosIHNjYWxlLCBzY29yZSkgJT4lCiAgc3ByZWFkKHNjYWxlLCBzY29yZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJwN19zdWJqIikgJT4lCiAgY29yLmNpKHBsb3QgPSBGKQoKY29yX3ExJHJobyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ2MSIpICU+JQogIGdhdGhlcih2MiwgciwgLXYxKSAlPiUKICBtdXRhdGVfYXQodmFycyh2MSwgdjIpLAogICAgICAgICAgICBmdW5zKHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgICAgLiwKICAgICAgICAgICAgICAicDdfc2VfdG90YWwiID0gIlNwaXJpdHVhbCBldmVudHMiLAogICAgICAgICAgICAgICJwN19kc2VfdG90YWwiID0gIkRTRSAoYWxsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgInA3X2RzZV90b3RhbF9tb3JlIiA9ICJEU0UgKG1vcmUgc3Bpcml0dWFsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgInA3X2RzZV90b3RhbF9sZXNzIiA9ICJEU0UgKGxlc3Mgc3Bpcml0dWFsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgInA3X3Bvcl90b3RhbCIgPSAiUG9yb3NpdHkgKER1bGluKSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdjEsIHkgPSB2MiwgZmlsbCA9IHIsIAogICAgICAgICAgICAgbGFiZWwgPSBmb3JtYXQocm91bmQociwgMiksIG5zbWFsbCA9IDIpKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMi41LCB4bWF4ID0gNC41LCB5bWluID0gMC41LCB5bWF4ID0gMS41LAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSkgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDIuNSwgeG1heCA9IDQuNSwgeW1pbiA9IDQuNSwgeW1heCA9IDUuNSwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAxLCBiYXJoZWlnaHQgPSAxMCkpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiQ29ycmVsYXRpb25zIGFtb25nIHN1YnNldHMgb2YgdGhlIERhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyAoRFNFKSBzY2FsZSxcbnRoZSBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlLCBhbmQgdGhlIFBvcm9zaXR5IChEdWxpbikgc2NhbGUiLAogICAgICAgc3VidGl0bGUgPSAiTm8gc3RhbmRhcmRpemF0aW9uIiwKICAgICAgIGZpbGwgPSAiUGVhcnNvbidzIHIiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC44LCBpbmNsdWRlID0gRn0KIyAjIGNvcnJlbGF0aW9ucyBhZnRlciBzdGFuZGFyZGl6aW5nIHdpdGhpbiBlYWNoIHNpdGUKIyBjb3JfcTFfc3RkX2J5c2l0ZSA8LSBkX3ExICU+JQojICAgZmlsdGVyKGdyZXBsKCJfZHNlXyIsIHNjYWxlKSB8IGdyZXBsKCJfc2VfIiwgc2NhbGUpIHwKIyAgICAgICAgICAgIGdyZXBsKCJfcG9yXyIsIHNjYWxlKSkgJT4lCiMgICBzZWxlY3QocDdfc3Viaiwgc2NhbGUsIHNjb3JlX3N0ZF9ieXNpdGUpICU+JQojICAgc3ByZWFkKHNjYWxlLCBzY29yZV9zdGRfYnlzaXRlKSAlPiUKIyAgIGNvbHVtbl90b19yb3duYW1lcygicDdfc3ViaiIpICU+JQojICAgY29yLmNpKHBsb3QgPSBGKQojIAojIGNvcl9xMV9zdGRfYnlzaXRlJHJobyAlPiUKIyAgIGRhdGEuZnJhbWUoKSAlPiUKIyAgIHJvd25hbWVzX3RvX2NvbHVtbigidjEiKSAlPiUKIyAgIGdhdGhlcih2MiwgciwgLXYxKSAlPiUKIyAgIG11dGF0ZV9hdCh2YXJzKHYxLCB2MiksCiMgICAgICAgICAgICAgZnVucyhyZWNvZGVfZmFjdG9yKAojICAgICAgICAgICAgICAgLiwKIyAgICAgICAgICAgICAgICJwN19zZV90b3RhbCIgPSAiU3Bpcml0dWFsIGV2ZW50cyIsCiMgICAgICAgICAgICAgICAicDdfZHNlX3RvdGFsIiA9ICJEU0UgKGFsbCBpdGVtcykiLAojICAgICAgICAgICAgICAgInA3X2RzZV90b3RhbF9tb3JlIiA9ICJEU0UgKG1vcmUgc3Bpcml0dWFsIGl0ZW1zKSIsCiMgICAgICAgICAgICAgICAicDdfZHNlX3RvdGFsX2xlc3MiID0gIkRTRSAobGVzcyBzcGlyaXR1YWwgaXRlbXMpIiwKIyAgICAgICAgICAgICAgICJwN19wb3JfdG90YWwiID0gIlBvcm9zaXR5IChEdWxpbikiKSkpICU+JQojICAgZ2dwbG90KGFlcyh4ID0gdjEsIHkgPSB2MiwgZmlsbCA9IHIsIAojICAgICAgICAgICAgICBsYWJlbCA9IGZvcm1hdChyb3VuZChyLCAyKSwgbnNtYWxsID0gMikpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICBnZW9tX3RleHQoKSArCiMgICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAyLjUsIHhtYXggPSA0LjUsIHltaW4gPSAwLjUsIHltYXggPSAxLjUsCiMgICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsKIyAgIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDIuNSwgeG1heCA9IDQuNSwgeW1pbiA9IDQuNSwgeW1heCA9IDUuNSwKIyAgICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAxLCBiYXJoZWlnaHQgPSAxMCkpICsKIyAgIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKIyAgIGxhYnModGl0bGUgPSAiQ29ycmVsYXRpb25zIGFtb25nIHN1YnNldHMgb2YgdGhlIERhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyAoRFNFKSBzY2FsZVxudGhlIFNwaXJpdHVhbCBFdmVudHMgc2NhbGUsIGFuZCB0aGUgUG9yb3NpdHkgKER1bGluKSBzY2FsZSIsCiMgICAgICAgIHN1YnRpdGxlID0gIkFmdGVyIHN0YW5kYXJkaXppbmcgd2l0aGluIGVhY2ggc2l0ZSIsCiMgICAgICAgIGZpbGwgPSAiUGVhcnNvbidzIHIiKQpgYGAKCl9fQ29ycmVsYXRpb25zIHdpdGggU3Bpcml0dWFsIEV2ZW50c19fOgoKLSBUaGUgc3Vic2V0IG9mIGxlc3Mgc3Bpcml0dWFsIERTRSBpdGVtcyB3YXMgc3Ryb25nbHkgY29ycmVsYXRlZCB3aXRoIHRoZSBTcGlyaXR1YWwgRXZlbnRzIHRvdGFsIHNjb3JlIChyID0gYHIgcm91bmQoY29yX3ExJHJob1sicDdfZHNlX3RvdGFsX2xlc3MiLCAicDdfc2VfdG90YWwiXSwgMilgLCA5NSUgQ0k6IFtgciByb3VuZChjb3JfcTEkY2lbInA3X2RzX3R0bF9sLXA3X3NfIiwgImxvdy5lIl0sIDIpYCwgYHIgcm91bmQoY29yX3ExJGNpWyJwN19kc190dGxfbC1wN19zXyIsICJ1cC5lIl0sIDIpYF0sIHAgPSBgciByb3VuZChjb3JfcTEkY2lbInA3X2RzX3R0bF9sLXA3X3NfIiwgInAiXSwgMilgKS4gCi0gTnVtZXJpY2FsbHkgc3BlYWtpbmcsIHRoaXMgY29ycmVsYXRpb24gYXBwZWFycyB0byBiZSBzb21ld2hhdCB3ZWFrZXIgdGhhbiB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgc3Vic2V0IG9mIG1vcmUgc3Bpcml0dWFsIERTRSBpdGVtcyBhbmQgU3Bpcml0dWFsIEV2ZW50cyAociA9IGByIHJvdW5kKGNvcl9xMSRyaG9bInA3X2RzZV90b3RhbF9tb3JlIiwgInA3X3NlX3RvdGFsIl0sIDIpYCwgOTUlIENJOiBbYHIgcm91bmQoY29yX3ExJGNpWyJwN19kc190dGxfbS1wN19zXyIsICJsb3cuZSJdLCAyKWAsIGByIHJvdW5kKGNvcl9xMSRjaVsicDdfZHNfdHRsX20tcDdfc18iLCAidXAuZSJdLCAyKWBdLCBwID0gYHIgcm91bmQoY29yX3ExJGNpWyJwN19kc190dGxfbS1wN19zXyIsICJwIl0sIDIpYCkuCgpfX0NvcnJlbGF0aW9ucyB3aXRoIFBvcm9zaXR5X186CgotIFRoZSBzdWJzZXQgb2YgbGVzcyBzcGlyaXR1YWwgRFNFIGl0ZW1zIHdhcyBzdHJvbmdseSBjb3JyZWxhdGVkIHdpdGggdGhlIFBvcm9zaXR5IChEdWxpbikgdG90YWwgc2NvcmUgKHIgPSBgciByb3VuZChjb3JfcTEkcmhvWyJwN19kc2VfdG90YWxfbGVzcyIsICJwN19wb3JfdG90YWwiXSwgMilgLCA5NSUgQ0k6IFtgciByb3VuZChjb3JfcTEkY2lbInA3X2RzX3R0bF9sLXA3X3BfIiwgImxvdy5lIl0sIDIpYCwgYHIgcm91bmQoY29yX3ExJGNpWyJwN19kc190dGxfbC1wN19wXyIsICJ1cC5lIl0sIDIpYF0sIHAgPSBgciByb3VuZChjb3JfcTEkY2lbInA3X2RzX3R0bF9sLXA3X3BfIiwgInAiXSwgMilgKS4gCi0gTnVtZXJpY2FsbHkgc3BlYWtpbmcsIHRoaXMgY29ycmVsYXRpb24gYXBwZWFycyB0byBiZSBzb21ld2hhdCB3ZWFrZXIgdGhhbiB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgc3Vic2V0IG9mIG1vcmUgc3Bpcml0dWFsIERTRSBpdGVtcyBhbmQgUG9yb3NpdHkgKER1bGluKSAociA9IGByIHJvdW5kKGNvcl9xMSRyaG9bInA3X2RzZV90b3RhbF9tb3JlIiwgInA3X3Bvcl90b3RhbCJdLCAyKWAsIDk1JSBDSTogW2ByIHJvdW5kKGNvcl9xMSRjaVsicDdfZHNfdHRsX20tcDdfcF8iLCAibG93LmUiXSwgMilgLCBgciByb3VuZChjb3JfcTEkY2lbInA3X2RzX3R0bF9tLXA3X3BfIiwgInVwLmUiXSwgMilgXSwgcCA9IGByIHJvdW5kKGNvcl9xMSRjaVsicDdfZHNfdHRsX20tcDdfcF8iLCAicCJdLCAyKWApLgoKYGBge3J9CiMgY29ycmVsYXRpb25zIHdpdGhvdXQgc3RhbmRhcmRpemluZzoKY29yX3ExX2J5c2l0ZSA8LSBkX3ExICU+JQogIGZpbHRlcihncmVwbCgiX2RzZV8iLCBzY2FsZSkgfCBncmVwbCgiX3NlXyIsIHNjYWxlKSB8CiAgICAgICAgICAgZ3JlcGwoIl9wb3JfIiwgc2NhbGUpKSAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3Viaiwgc2NhbGUsIHNjb3JlKSAlPiUKICBzcHJlYWQoc2NhbGUsIHNjb3JlKSAlPiUKICBncm91cF9ieShwN19jdHJ5KSAlPiUKICBzdW1tYXJpc2UoCiAgICBkc2VfdG90YWwuc2VfdG90YWwgPSBjb3IocDdfZHNlX3RvdGFsLCBwN19zZV90b3RhbCksCiAgICBkc2VfdG90YWxfbW9yZS5zZV90b3RhbCA9IGNvcihwN19kc2VfdG90YWxfbW9yZSwgcDdfc2VfdG90YWwpLAogICAgZHNlX3RvdGFsX2xlc3Muc2VfdG90YWwgPSBjb3IocDdfZHNlX3RvdGFsX2xlc3MsIHA3X3NlX3RvdGFsKSwKICAgIGRzZV90b3RhbC5wb3JfdG90YWwgPSBjb3IocDdfZHNlX3RvdGFsLCBwN19wb3JfdG90YWwpLAogICAgZHNlX3RvdGFsX21vcmUucG9yX3RvdGFsID0gY29yKHA3X2RzZV90b3RhbF9tb3JlLCBwN19wb3JfdG90YWwpLAogICAgZHNlX3RvdGFsX2xlc3MucG9yX3RvdGFsID0gY29yKHA3X2RzZV90b3RhbF9sZXNzLCBwN19wb3JfdG90YWwpKSAlPiUKICBmdWxsX2pvaW4oZF9xMSAlPiUKICAgICAgICAgICAgICBmaWx0ZXIoZ3JlcGwoIl9kc2VfIiwgc2NhbGUpIHwgZ3JlcGwoIl9zZV8iLCBzY2FsZSkgfAogICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJfcG9yXyIsIHNjYWxlKSkgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHA3X3N1YmosIHNjYWxlLCBzY29yZSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHA3X2N0cnkgPSAiT1ZFUkFMTCIpICU+JQogICAgICAgICAgICAgIGdyb3VwX2J5KHA3X2N0cnkpICU+JQogICAgICAgICAgICAgIHNwcmVhZChzY2FsZSwgc2NvcmUpICU+JQogICAgICAgICAgICAgIHN1bW1hcmlzZSgKICAgICAgICAgICAgICAgIGRzZV90b3RhbC5zZV90b3RhbCA9IGNvcihwN19kc2VfdG90YWwsIHA3X3NlX3RvdGFsKSwKICAgICAgICAgICAgICAgIGRzZV90b3RhbF9tb3JlLnNlX3RvdGFsID0gY29yKHA3X2RzZV90b3RhbF9tb3JlLCBwN19zZV90b3RhbCksCiAgICAgICAgICAgICAgICBkc2VfdG90YWxfbGVzcy5zZV90b3RhbCA9IGNvcihwN19kc2VfdG90YWxfbGVzcywgcDdfc2VfdG90YWwpLAogICAgICAgICAgICAgICAgZHNlX3RvdGFsLnBvcl90b3RhbCA9IGNvcihwN19kc2VfdG90YWwsIHA3X3Bvcl90b3RhbCksCiAgICAgICAgICAgICAgICBkc2VfdG90YWxfbW9yZS5wb3JfdG90YWwgPSBjb3IocDdfZHNlX3RvdGFsX21vcmUsIHA3X3Bvcl90b3RhbCksCiAgICAgICAgICAgICAgICBkc2VfdG90YWxfbGVzcy5wb3JfdG90YWwgPSBjb3IocDdfZHNlX3RvdGFsX2xlc3MsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwN19wb3JfdG90YWwpKSkgJT4lCiAgZ2F0aGVyKHBhaXIsIHIsIC1wN19jdHJ5KSAlPiUKICBzZXBhcmF0ZShwYWlyLCBpbnRvID0gYygidjEiLCAidjIiKSwgc2VwID0gIlxcLiIpICU+JQogIG11dGF0ZShwN19jdHJ5ID0gZmFjdG9yKHA3X2N0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAiQ2hpbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbnVhdHUiLCAiT1ZFUkFMTCIpKSkgJT4lCiAgcmVuYW1lKHNhbXBsZSA9IHA3X2N0cnkpCmBgYAoKSG93ZXZlciwgYXJlIHRoZXNlIF9tZWFuaW5nZnVsXyBkaWZmZXJlbmNlcz8gT25lIGltcG9ydGFudCB0aGluZyB0byBrZWVwIGluIG1pbmQgaXMgdGhhdCB0aGUgcmVsaWFiaWxpdHkgb2YgYSBzY2FsZSAoaG93IHN0cm9uZ2x5IGl0cyBpdGVtcyBhcmUgY29ycmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIpIGFmZmVjdHMgaG93IHN0cm9uZ2x5IGNvcnJlbGF0ZWQgdGhlIHRvdGFsIHNjYWxlIGNhbiBiZSB3aXRoIG90aGVyIG1lYXN1cmVzLiBBIHJvdWdoIHJ1bGUgb2YgdGh1bWIgaXMgdGhhdCB0aGUgcmVsaWFiaWxpdHkgb2YgYSBzY2FsZSBzZXRzIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGF0IHNjYWxlIGFuZCBvdGhlcnMuIFNpbmNlIHRoZXNlIHR3byBzdWJzZXRzIG9mIERTRSBhcmUga2luZCBvZiBhZC1ob2MgKGFuZCBkZWZpbml0ZWx5IHBvc3QtaG9jKSBicmVha2Rvd25zIG9mIGEgcHJlLWV4aXN0aW5nIHNjYWxlLCB0aGlzIHNlZW1zIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIGNoZWNrIGhlcmUuCgpXaXRoIHRoaXMgaW4gbWluZCwgbGV0J3MgY2hlY2sgdGhlIHJlbGlhYmlsaXR5IG9mIHRoZSB0d28gc3Vic2V0cyBvZiB0aGUgRFNFIHNjYWxlLCBhbmQgbG9vayBhdCBob3cgdGhlc2UgY29ycmVsYXRpb25zIHdpdGggU3Bpcml0dWFsIEV2ZW50cyBhbmQgUG9yb3NpdHkgKER1bGluKSBzdGFjayB1cCB0byB0aGUgdXBwZXIgbGltaXQgaW1wb3NlZCBieSByZWxpYWJpbGl0eS4uLiBhbmQganVzdCBmb3IgZnVuIEknbGwgdGhyb3cgaW4gdGhlIGNvcnJlbGF0aW9ucyB3aXRoaW4gZWFjaCBzaXRlIGFzIHdlbGwuCgpgYGB7cn0KYWxwaGFfYnlfY3RyeV9mdW4gPC0gZnVuY3Rpb24oZGYpewogIAogIGRmIDwtIGRmICU+JSAKICAgIHNlbGVjdCgtZW5kc193aXRoKCJfY2F0IiksIC1jb250YWlucygidG90YWwiKSwgLWNvbnRhaW5zKCdjaGVjaycpKQogIAogIGFscGhhX2Z1biA8LSBmdW5jdGlvbihkZil7CiAgICBhbHBoYV9kZiA8LSBwc3ljaDo6YWxwaGEoZGYpCiAgICByYXdfYWxwaGEgPC0gYWxwaGFfZGYkdG90YWxbMV1bXSAlPiUgYXMubnVtZXJpYygpCiAgICByZXR1cm4ocmF3X2FscGhhKQogIH0KICAKICBhIDwtIGMoCiAgICBhbHBoYV91cyA9IGFscGhhX2Z1bihkZiAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihwN19jdHJ5ID09ICJVUyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoLXA3X2N0cnkpKSwKICAgIGFscGhhX2doID0gYWxwaGFfZnVuKGRmICU+JSBmaWx0ZXIocDdfY3RyeSA9PSAiR2hhbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KC1wN19jdHJ5KSksCiAgICBhbHBoYV90aCA9IGFscGhhX2Z1bihkZiAlPiUgZmlsdGVyKHA3X2N0cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCgtcDdfY3RyeSkpLAogICAgYWxwaGFfY2ggPSBhbHBoYV9mdW4oZGYgJT4lIGZpbHRlcihwN19jdHJ5ID09ICJDaGluYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoLXA3X2N0cnkpKSwKICAgIGFscGhhX3Z0ID0gYWxwaGFfZnVuKGRmICU+JSBmaWx0ZXIocDdfY3RyeSA9PSAiVmFudWF0dSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoLXA3X2N0cnkpKSwKICAgIGFscGhhX2FsbCA9IGFscGhhX2Z1bihkZiAlPiUgc2VsZWN0KC1wN19jdHJ5KSkpCiAgCiAgcmV0dXJuKGEpCn0KYGBgCgpgYGB7cn0KZF9hbHBoYSA8LSBkYXRhLmZyYW1lKAogICMgYFNwaXJpdHVhbCBFdmVudHNgID0gYWxwaGFfYnlfY3RyeV9mdW4oCiAgIyAgIGQwICU+JSBzZWxlY3QocDdfY3RyeSwgY29udGFpbnMoIl9zZV8iKSkgJT4lIHJlbW92ZV9taXNzaW5nKCkpLAogIGBEU0UgKGFsbCBpdGVtcylgID0gYWxwaGFfYnlfY3RyeV9mdW4oCiAgICBkMCAlPiUgc2VsZWN0KHA3X2N0cnksIGNvbnRhaW5zKCJfZHNlXyIpKSksCiAgYERTRSAobW9yZSBzcGlyaXR1YWwgaXRlbXMpYCA9IGFscGhhX2J5X2N0cnlfZnVuKAogICAgZDAgJT4lIHNlbGVjdChwN19jdHJ5LCBjb250YWlucygiX2RzZV8iKSkgJT4lCiAgICAgIHNlbGVjdCgtYyhwN19kc2Vfc3BpLnN0cmVuZ3RoLCBwN19kc2Vfc3BpcnQuY29tZm9ydCwgIyBxNC01CiAgICAgICAgICAgICAgICBwN19kc2VfYmxlc3NpbmdzLCBwN19kc2Vfc2VsZmxlc3MuY2FyZSwgIyBxMTMtMTQKICAgICAgICAgICAgICAgIHA3X2RzZV9hY2NlcHQud3JvbmcpKSksICNxMTUKICBgRFNFIChsZXNzIHNwaXJpdHVhbCBpdGVtcylgID0gYWxwaGFfYnlfY3RyeV9mdW4oCiAgICBkMCAlPiUgc2VsZWN0KHA3X2N0cnksIAogICAgICAgICAgICAgICAgICBwN19kc2Vfc3BpLnN0cmVuZ3RoLCBwN19kc2Vfc3BpcnQuY29tZm9ydCwgIyBxNC01CiAgICAgICAgICAgICAgICAgIHA3X2RzZV9ibGVzc2luZ3MsIHA3X2RzZV9zZWxmbGVzcy5jYXJlLCAjIHExMy0xNAogICAgICAgICAgICAgICAgICBwN19kc2VfYWNjZXB0Lndyb25nKSkpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic2FtcGxlIikgJT4lCiAgZ2F0aGVyKHNjYWxlLCByYXdfYWxwaGEsIC1zYW1wbGUpICU+JQogIG11dGF0ZShzYW1wbGUgPSAKICAgICAgICAgICByZWNvZGVfZmFjdG9yKGdzdWIoImFscGhhXyIsICIiLCBzYW1wbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgInVzIiA9ICJVUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiZ2giID0gIkdoYW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0aCIgPSAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgImNoIiA9ICJDaGluYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAidnQiID0gIlZhbnVhdHUiLAogICAgICAgICAgICAgICAgICAgICAgICAgImFsbCIgPSAiT1ZFUkFMTCIpLAogICAgICAgICBzY2FsZSA9IGdzdWIoIlxcLlxcLiQiLCAiKSIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJcXC5cXC4iLCAiICgiLCBzY2FsZSksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiXFwuJCIsICIpIiwgc2NhbGUpLAogICAgICAgICBzY2FsZSA9IGdzdWIoIlxcLiIsICIgIiwgc2NhbGUpLAogICAgICAgICBzY2FsZSA9IGZhY3RvcihzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygjIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEU0UgKGFsbCBpdGVtcykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRFNFIChtb3JlIHNwaXJpdHVhbCBpdGVtcykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRFNFIChsZXNzIHNwaXJpdHVhbCBpdGVtcykiKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjQsIGluY2x1ZGUgPSBUfQpkX2FscGhhICU+JQogIG11dGF0ZShzY29wZSA9IGlmZWxzZShzYW1wbGUgPT0gIk9WRVJBTEwiLCAic2l0ZSIsICJvdmVyYWxsIikpICU+JQogIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IHJhd19hbHBoYSwgIGNvbG9yID0gc2FtcGxlLCAKICAgICAgICAgICAgIHNoYXBlID0gc2NvcGUsIHNpemUgPSBzY29wZSkpICsKICBmYWNldF93cmFwKH4gc2NhbGUsIG5jb2wgPSA2KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC44LCBsdHkgPSAyKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjcsIGx0eSA9IDIsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBjb3JfcTFfYnlzaXRlICU+JQogICAgICAgICAgICAgICBmaWx0ZXIodjEgIT0gInBvcl90b3RhbCIsIHYyICE9ICJwb3JfdG90YWwiKSAlPiUKICAgICAgICAgICAgICAgbXV0YXRlKHNjb3BlID0gaWZlbHNlKHNhbXBsZSA9PSAiT1ZFUkFMTCIsICJzaXRlIiwgIm92ZXJhbGwiKSkgJT4lCiAgICAgICAgICAgICAgIHJlbmFtZShzY2FsZSA9IHYxKSAlPiUKICAgICAgICAgICAgICAgbXV0YXRlKHNjYWxlID0gcmVjb2RlKAogICAgICAgICAgICAgICAgIHNjYWxlLAogICAgICAgICAgICAgICAgICJkc2VfdG90YWwiID0gIkRTRSAoYWxsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgICAgImRzZV90b3RhbF9sZXNzIiA9ICJEU0UgKGxlc3Mgc3Bpcml0dWFsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgICAgImRzZV90b3RhbF9tb3JlIiA9ICJEU0UgKG1vcmUgc3Bpcml0dWFsIGl0ZW1zKSIpKSwKICAgICAgICAgICAgIGFlcyh5ID0gciksIHNoYXBlID0gOSxzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDIsIDQpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsIDE4KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJSZWxpYWJpbGl0eSBieSBzaXRlIGFuZCBvdmVyYWxsLCBhbmQgY29ycmVsYXRpb25zIHdpdGggU3Bpcml0dWFsIEV2ZW50cyBzY2FsZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJTb2xpZCBkb3RzIGFyZSByZWxpYWJpbGl0eSAoQ3JvbmJhY2gncyBhbHBoYSkgZm9yIGVhY2ggc2NhbGUvc3Vic2NhbGUgKGFscGhhID0gMC44IGlzIGEgY2xhc3NpYyBjdXRvZmYgZm9yICdnb29kJyByZWxpYWJpbGl0eSlcbkNyb3NzLWhhdGNoZXMgYXJlIGNvcnJlbGF0aW9ucyB3aXRoIFNwaXJpdHVhbCBFdmVudHMsIHdoaWNoIGluIHRoZW9yeSBhcmUgY2FwcGVkIGF0IHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgdHdvIHNjYWxlcyBpbnZvbHZlZCIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIkNyb25iYWNoJ3MgYWxwaGEgKHJhbmdlOiAwLTEpXG5PUiBQZWFyc29uJ3MgciAocmFuZ2U6IC0xIHRvICsxKSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjQsIGluY2x1ZGUgPSBUfQpkX2FscGhhICU+JQogIG11dGF0ZShzY29wZSA9IGlmZWxzZShzYW1wbGUgPT0gIk9WRVJBTEwiLCAic2l0ZSIsICJvdmVyYWxsIikpICU+JQogIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IHJhd19hbHBoYSwgIGNvbG9yID0gc2FtcGxlLCAKICAgICAgICAgICAgIHNoYXBlID0gc2NvcGUsIHNpemUgPSBzY29wZSkpICsKICBmYWNldF93cmFwKH4gc2NhbGUsIG5jb2wgPSA2KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC44LCBsdHkgPSAyKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjcsIGx0eSA9IDIsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBjb3JfcTFfYnlzaXRlICU+JQogICAgICAgICAgICAgICBmaWx0ZXIodjEgIT0gInNlX3RvdGFsIiwgdjIgIT0gInNlX3RvdGFsIikgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZShzY29wZSA9IGlmZWxzZShzYW1wbGUgPT0gIk9WRVJBTEwiLCAic2l0ZSIsICJvdmVyYWxsIikpICU+JQogICAgICAgICAgICAgICByZW5hbWUoc2NhbGUgPSB2MSkgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZShzY2FsZSA9IHJlY29kZSgKICAgICAgICAgICAgICAgICBzY2FsZSwKICAgICAgICAgICAgICAgICAiZHNlX3RvdGFsIiA9ICJEU0UgKGFsbCBpdGVtcykiLAogICAgICAgICAgICAgICAgICJkc2VfdG90YWxfbGVzcyIgPSAiRFNFIChsZXNzIHNwaXJpdHVhbCBpdGVtcykiLAogICAgICAgICAgICAgICAgICJkc2VfdG90YWxfbW9yZSIgPSAiRFNFIChtb3JlIHNwaXJpdHVhbCBpdGVtcykiKSksCiAgICAgICAgICAgICBhZXMoeSA9IHIpLCBzaGFwZSA9IDksc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYygyLCA0KSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LCAxOCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUmVsaWFiaWxpdHkgYnkgc2l0ZSBhbmQgb3ZlcmFsbCwgYW5kIGNvcnJlbGF0aW9ucyB3aXRoIFBvcm9zaXR5IChEdWxpbikgc2NhbGUiLAogICAgICAgc3VidGl0bGUgPSAiU29saWQgZG90cyBhcmUgcmVsaWFiaWxpdHkgKENyb25iYWNoJ3MgYWxwaGEpIGZvciBlYWNoIHNjYWxlL3N1YnNjYWxlIChhbHBoYSA9IDAuOCBpcyBhIGNsYXNzaWMgY3V0b2ZmIGZvciAnZ29vZCcgcmVsaWFiaWxpdHkpXG5Dcm9zcy1oYXRjaGVzIGFyZSBjb3JyZWxhdGlvbnMgd2l0aCBQb3Jvc2l0eSAoRHVsaW4pLCB3aGljaCBpbiB0aGVvcnkgYXJlIGNhcHBlZCBhdCB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIHR3byBzY2FsZXMgaW52b2x2ZWQiLAogICAgICAgeCA9ICJTaXRlIiwgeSA9ICJDcm9uYmFjaCdzIGFscGhhIChyYW5nZTogMC0xKVxuT1IgUGVhcnNvbidzIHIgKHJhbmdlOiAtMSB0byArMSkiKQpgYGAKClRoZSBzb2xpZCBkb3RzIGluIHRoZXNlIHBsb3RzIGlsbHVzdHJhdGUgdGhhdCB0aGUgc3Vic2V0IG9mIGxlc3Mgc3Bpcml0dWFsIERTRSBpdGVtcyAoY2VudGVyIHBhbmVsKSBmb3JtZWQgYSBnZW5lcmFsbHkgbGVzcyByZWxpYWJsZSAic2NhbGUiIHRoYW4gdGhlIHN1YnNldCBvZiBtb3JlIHNwaXJpdHVhbCBEU0UgaXRlbXMgKHJpZ2h0bW9zdCkuIFRoaXMgaGFzIHRoZSBpbXBvcnRhbnQgY29uc2VxdWVuY2Ugb2YgZm9yY2luZyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgbGVzcyBzcGlyaXR1YWwgaXRlbXMgYW5kIHRoZSBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlIGluIHNvbWUgc2Vuc2UgdG8gYmUgd2Vha2VyLiAKCkdpdmVuIHRoaXMsIHdoYXQgSSdtIGludGVyZXN0ZWQgaW4gaXMgd2hldGhlciB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY3Jvc3MtaGF0Y2ggKHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBiZXR3ZWVuIHRoYXQgc2NhbGUgYW5kIFNwaXJpdHVhbCBFdmVudHMsIGluIHRoZSBmaXJzdCBwbG90OyBvciBiZXR3ZWVuIHRoYXQgc2NhbGUgYW5kIFBvcm9zaXR5IChEdWxpbiksIGluIHRoZSBzZWNvbmQgcGxvdCkgYW5kIHRoZSBzb2xpZCBkb3QgKHRoZSByZWxpYWJpbGl0eSBvZiB0aGF0IHNjYWxlKSBkaWZmZXJzIGFjcm9zcyB0aGUgcGFuZWxzLiBJZiB0aGlzIGRpc3RhbmNlIHdlcmUgZ3JlYXRlciBmb3IgdGhlIHN1YnNldCBvZiBsZXNzIHNwaXJ0aXVhbCBEU0UgaXRlbXMsIHRoaXMgd291bGQgc3RyZW5ndGhlbiBteSBiZWxpZWYgdGhhdCB0aGVzZSBpdGVtcyB3ZXJlIG1lYW5pbmdmdWxseSBsZXNzIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gU3Bpcml0dWFsIEV2ZW50cy9Qb3Jvc2l0eSAtIGJ1dCB0aGF0J3Mgbm90IHJlYWxseSB3aGF0IEkgc2VlIGhlcmUgaW4gZWl0aGVyIGNhc2UuIEluc3RlYWQsIGlmIHlvdSB0aGluayBvZiByZWxpYWJpbGl0eSBhcyBhbiB1cHBlciBsaW1pdCBmb3IgY29ycmVsYXRpb24sIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvcnJlbGF0aW9ucyBzdGFydHMgdG8gbG9vayBsaWtlIGFuIGFydGlmYWN0IG9mIGRpZmZlcmVuY2VzIGluIHJlbGlhYmlsaXR5LgoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPktBUkEnUyBDVVJSRU5UIFRBS0UtQVdBWTogQm90aCBsZXNzIHNwaXJpdHVhbCBhbmQgbW9yZSBzcGlyaXR1YWwgRFNFIGl0ZW1zIHdlcmUgc3Ryb25nbHkgY29ycmVsYXRlZCB3aXRoIFNwaXJpdHVhbCBFdmVudHMsIGFuZCB3aXRoIFBvcm9zaXR5LiBUaGVzZSByZWxhdGlvbnNoaXBzIHdlcmUgc29tZXdoYXQgd2Vha2VyIGZvciB0aGUgbGVzcyBzcGlyaXR1YWwgRFNFIGl0ZW1zLCBidXQgSSdtIG5vdCBzdXJlIHRoZXNlIGRpZmZlcmVuY2VzIHdlcmUgbWVhbmluZ2Z1bOKAlHRoZXkgbWlnaHQgd2VsbCBiZSBhbiBhcnRpZmFjdCBvZiB1bmRlcmx5aW5nIGRpZmZlcmVuY2VzIGluIHJlbGlhYmlsaXR5IGFjcm9zcyB0aGUgdHdvIHN1YnNldHMgb2YgRFNFIGl0ZW1zLjwvc3Bhbj4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMgUXVlc3Rpb24gIzI6IEZvY3VzaW5nIG9uIGRpZmZlcmVudCBzZXRzIG9mIHNwaXJpdHVhbCBldmVudHMgZnJvbSB0aGUgU3Bpcml0dWFsIEV2ZW50cyBzY2FsZQoKVGFueWEncyBxdWVzdGlvbjogX1NwaXJpdHVhbCBFdmVudHMgKHRocmVlIGdyb3VwczogMTQsIDE1LCAyNiwgdGhlbiAxNywgMTgsIDE5LCB0aGVuIDIwLCAyMSwgdGhlbiBhbGwgdGhlc2UgdG9nZXRoZXIp4oCUZG8gdGhlc2UgY29ycmVsYXRlIGxlc3Mgd2l0aCBwb3Jvc2l0eSB0aGFuIDEtMTMgZnJvbSB0aGF0IHNjYWxlP18KCk5PVEVTOiAKCi0gSW4gUGFja2V0IDcsIHRoZSBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlIG9ubHkgaW5jbHVkZWQgMjMgaXRlbXMgKG5vIHF1ZXN0aW9uICMyNiksIGFuZCBJIHN1c3BlY3QgeW91IG1pZ2h0IGhhdmUgbWVhbnQgMTYgaW5zdGVhZCwgc28gSSB3ZW50IHdpdGggdGhpcyBmb3Igbm93LiAtIEkgYWxzbyB3YW50IHRvIHBvaW50IG91dCB0aGF0IHRoaXMgZ3JvdXBpbmcgKDEtMTMgdnMuIDE0LTIxKSBsZWF2ZXMgb3V0IHF1ZXN0aW9ucyAyMi0yMy4KLSBHaXZlbiBteSBjb25jZXJucyBhYm91dCByZWxpYWJpbGl0eSwgSSdtIGdvaW5nIHRvIHN0YXJ0IHdpdGggdGhlIGNvYXJzZXN0IGdyb3VwaW5nIC0gY29tcGFyaW5nIGEgMy1pdGVtICJzY2FsZSIgd2l0aCBhIDEzLWl0ZW0gc2NhbGUgY291bGQgcmVhbGx5IG9ic2N1cmUgd2hhdCdzIGdvaW5nIG9uIGhlcmUuIFdlIGNhbiBjb21lIGJhY2sgdG8gdGhpcyBhbmQgZGlzY3VzcyBtb3JlIQoKYGBge3J9CmRfcTIgPC0gZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIGNvbnRhaW5zKCJfc2VfIikpICU+JQogIHNlbGVjdCgtY29udGFpbnMoInRvdGFsIiksIC1jb250YWlucygiY2hlY2siKSwgLWVuZHNfd2l0aCgiX2NhdCIpKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCBjb250YWlucygiX3NlXyIpKSAlPiUKICBtdXRhdGUoc2VfcGFydCA9IGNhc2Vfd2hlbigKICAgIHF1ZXN0aW9uICVpbiUgYygicDdfc2Vfc2hha2luZy5wcmF5ZXIiLCAicDdfc2VfZW1vdGlvbi5wcmF5ZXIiLCAjIHExNC0xNQogICAgICAgICAgICAgICAgICAgICJwN19zZV9wb3dyZnVsLnByYXllciIsICJwN19zZV9vdXQuYm9keS5leHAiLCAjcTE2LTE3CiAgICAgICAgICAgICAgICAgICAgInA3X3NlX2JvZHkuY29udHJvbCIsICJwN19zZV9zbGVwLnBhcmFseXNpcyIsICNxMTgtMTkgCiAgICAgICAgICAgICAgICAgICAgInA3X3NlX2dvZC50aHJ1LnBhaW4iLCAicDdfc2VfZ29kLmlsbG5lc3MiKSB+ICNxMjAtMjEKICAgICAgInA3X3NlX3RvdGFsX3ExNHRvMjEiLAogICAgVFJVRSB+ICJwN19zZV90b3RhbF9xMXRvMTMiKSkgJT4lIAogIGdyb3VwX2J5KHA3X2N0cnksIHA3X3N1YmosIHNlX3BhcnQpICU+JQogIHN1bW1hcmlzZShzY29yZSA9IHN1bShyZXNwb25zZSwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNwcmVhZChzZV9wYXJ0LCBzY29yZSkgJT4lCiAgbGVmdF9qb2luKGQwICU+JSBzZWxlY3QocDdfc3ViaiwgY29udGFpbnMoInRvdGFsIikpKSAlPiUKICBtdXRhdGVfYXQodmFycygtYyhwN19jdHJ5LCBwN19zdWJqKSksIGZ1bnMoYXMubnVtZXJpYykpICU+JQogIGdhdGhlcihzY2FsZSwgc2NvcmUsIC1jKHA3X2N0cnksIHA3X3N1YmopKSAlPiUKICBncm91cF9ieShzY2FsZSkgJT4lCiAgbXV0YXRlKHNjb3JlX3N0ZCA9IHNjYWxlKHNjb3JlLCBzY2FsZSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc2NhbGUsIHA3X2N0cnkpICU+JQogIG11dGF0ZShzY29yZV9zdGRfYnlzaXRlID0gc2NhbGUoc2NvcmUsIHNjYWxlID0gVCkpICU+JQogIHVuZ3JvdXAoKQpgYGAKCkknbGwgc3RhcnQgYnkgbG9va2luZyBhdCBjb3JyZWxhdGlvbnMgYmV0d2VlbiBTRSBpdGVtcyAjMTQtMjEsIFNFIGl0ZW1zICMxLTEzIGFuZCB0aGUgUG9yb3NpdHkgKER1bGluKSB0b3RhbCBzY29yZS4gSSdsbCBhbHNvIGluY2x1ZGUgdGhlIHJlbGV2YW50IGNvcnJlbGF0aW9ucyB3aXRoIHRoZSBTRSB0b3RhbCBzY29yZSBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC44LCBpbmNsdWRlID0gVH0KIyBjb3JyZWxhdGlvbnMgd2l0aG91dCBzdGFuZGFyZGl6aW5nOgpjb3JfcTIgPC0gZF9xMiAlPiUKICBmaWx0ZXIoZ3JlcGwoIl9zZV8iLCBzY2FsZSkgfCBncmVwbCgiX3Bvcl8iLCBzY2FsZSkpICU+JQogIHNlbGVjdChwN19zdWJqLCBzY2FsZSwgc2NvcmUpICU+JQogIHNwcmVhZChzY2FsZSwgc2NvcmUpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygicDdfc3ViaiIpICU+JQogIGNvci5jaShwbG90ID0gRikKCmNvcl9xMiRyaG8gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigidjEiKSAlPiUKICBnYXRoZXIodjIsIHIsIC12MSkgJT4lCiAgbXV0YXRlX2F0KHZhcnModjEsIHYyKSwKICAgICAgICAgICAgZnVucyhyZWNvZGVfZmFjdG9yKAogICAgICAgICAgICAgIC4sCiAgICAgICAgICAgICAgInA3X3NlX3RvdGFsIiA9ICJTRSAoYWxsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgInA3X3NlX3RvdGFsX3ExdG8xMyIgPSAiU0UgKGl0ZW1zICMxLTEzKSIsCiAgICAgICAgICAgICAgInA3X3NlX3RvdGFsX3ExNHRvMjEiID0gIlNFIChpdGVtcyAjMTQtMjEpIiwKICAgICAgICAgICAgICAicDdfcG9yX3RvdGFsIiA9ICJQb3Jvc2l0eSAoRHVsaW4pIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2MSwgeSA9IHYyLCBmaWxsID0gciwgCiAgICAgICAgICAgICBsYWJlbCA9IGZvcm1hdChyb3VuZChyLCAyKSwgbnNtYWxsID0gMikpKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dCgpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxLjUsIHhtYXggPSAzLjUsIHltaW4gPSAzLjUsIHltYXggPSA0LjUsCiAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMSwgYmFyaGVpZ2h0ID0gMTApKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkNvcnJlbGF0aW9ucyBhbW9uZyBzdWJzZXRzIG9mIHRoZSBTcGlyaXR1YWwgRXZlbnRzIChTRSkgc2NhbGUsXG5hbmQgdGhlIFBvcm9zaXR5IChEdWxpbikgc2NhbGUiLAogICAgICAgc3VidGl0bGUgPSAiTm8gc3RhbmRhcmRpemF0aW9uIiwKICAgICAgIGZpbGwgPSAiUGVhcnNvbidzIHIiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC44LCBpbmNsdWRlID0gRn0KIyAjIGNvcnJlbGF0aW9ucyBhZnRlciBzdGFuZGFyZGl6aW5nIHdpdGhpbiBlYWNoIHNpdGUKIyBjb3JfcTJfc3RkX2J5c2l0ZSA8LSBkX3EyICU+JQojICAgZmlsdGVyKGdyZXBsKCJfc2VfIiwgc2NhbGUpIHwgZ3JlcGwoIl9wb3JfIiwgc2NhbGUpKSAlPiUKIyAgIHNlbGVjdChwN19zdWJqLCBzY2FsZSwgc2NvcmVfc3RkX2J5c2l0ZSkgJT4lCiMgICBzcHJlYWQoc2NhbGUsIHNjb3JlX3N0ZF9ieXNpdGUpICU+JQojICAgY29sdW1uX3RvX3Jvd25hbWVzKCJwN19zdWJqIikgJT4lCiMgICBjb3IuY2kocGxvdCA9IEYpCiMgCiMgY29yX3EyX3N0ZF9ieXNpdGUkcmhvICU+JQojICAgZGF0YS5mcmFtZSgpICU+JQojICAgcm93bmFtZXNfdG9fY29sdW1uKCJ2MSIpICU+JQojICAgZ2F0aGVyKHYyLCByLCAtdjEpICU+JQojICAgbXV0YXRlX2F0KHZhcnModjEsIHYyKSwKIyAgICAgICAgICAgICBmdW5zKHJlY29kZV9mYWN0b3IoCiMgICAgICAgICAgICAgICAuLAojICAgICAgICAgICAgICAgInA3X3NlX3RvdGFsIiA9ICJTRSAoYWxsIGl0ZW1zKSIsCiMgICAgICAgICAgICAgICAicDdfc2VfdG90YWxfcTF0bzEzIiA9ICJTRSAoaXRlbXMgIzEtMTMpIiwKIyAgICAgICAgICAgICAgICJwN19zZV90b3RhbF9xMTR0bzIxIiA9ICJTRSAoaXRlbXMgIzE0LTIxKSIsCiMgICAgICAgICAgICAgICAicDdfcG9yX3RvdGFsIiA9ICJQb3Jvc2l0eSAoRHVsaW4pIikpKSAlPiUKIyAgIGdncGxvdChhZXMoeCA9IHYxLCB5ID0gdjIsIGZpbGwgPSByLCAKIyAgICAgICAgICAgICAgbGFiZWwgPSBmb3JtYXQocm91bmQociwgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwojICAgZ2VvbV90ZXh0KCkgKwojICAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMS41LCB4bWF4ID0gMy41LCB5bWluID0gMy41LCB5bWF4ID0gNC41LAojICAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDEsIGJhcmhlaWdodCA9IDEwKSkgKwojICAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwojICAgbGFicyh0aXRsZSA9ICJDb3JyZWxhdGlvbnMgYW1vbmcgc3Vic2V0cyBvZiB0aGUgU3Bpcml0dWFsIEV2ZW50cyAoU0UpIHNjYWxlLFxuYW5kIHRoZSBQb3Jvc2l0eSAoRHVsaW4pIHNjYWxlIiwKIyAgICAgICAgc3VidGl0bGUgPSAiQWZ0ZXIgc3RhbmRhcmRpemluZyB3aXRoaW4gZWFjaCBzaXRlIiwKIyAgICAgICAgZmlsbCA9ICJQZWFyc29uJ3MgciIpCmBgYAoKX19Db3JyZWxhdGlvbnMgd2l0aCBQb3Jvc2l0eV9fOgoKLSBUaGUgaGlnaGxpZ2h0ZWQgc3Vic2V0IG9mIFNFIGl0ZW1zICgjMTQtMjEpIHdhcyBzdHJvbmdseSBjb3JyZWxhdGVkIHdpdGggdGhlIFBvcm9zaXR5IChEdWxpbikgdG90YWwgc2NvcmUgKHIgPSBgciByb3VuZChjb3JfcTIkcmhvWyJwN19zZV90b3RhbF9xMTR0bzIxIiwgInA3X3Bvcl90b3RhbCJdLCAyKWAsIDk1JSBDSTogW2ByIHJvdW5kKGNvcl9xMiRjaVsicDdfcF8tcDdfX18xNCIsICJsb3cuZSJdLCAyKWAsIGByIHJvdW5kKGNvcl9xMiRjaVsicDdfcF8tcDdfX18xNCIsICJ1cC5lIl0sIDIpYF0sIHAgPSBgciByb3VuZChjb3JfcTIkY2lbInA3X3BfLXA3X19fMTQiLCAicCJdLCAyKWApLiAKLSBOdW1lcmljYWxseSBzcGVha2luZywgdGhpcyBjb3JyZWxhdGlvbiBhcHBlYXJzIHRvIGJlIHNvbWV3aGF0IHdlYWtlciB0aGFuIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBvdGhlciBzdWJzZXQgb2YgU0UgaXRlbXMgKCMxLTEzKSBhbmQgUG9yb3NpdHkgKER1bGluKSAociA9IGByIHJvdW5kKGNvcl9xMiRyaG9bInA3X3NlX3RvdGFsX3ExdG8xMyIsICJwN19wb3JfdG90YWwiXSwgMilgLCA5NSUgQ0k6IFtgciByb3VuZChjb3JfcTIkY2lbInA3X3BfLXA3X19fMTEiLCAibG93LmUiXSwgMilgLCBgciByb3VuZChjb3JfcTIkY2lbInA3X3BfLXA3X19fMTEiLCAidXAuZSJdLCAyKWBdLCBwID0gYHIgcm91bmQoY29yX3EyJGNpWyJwN19wXy1wN19fXzExIiwgInAiXSwgMilgKS4KCmBgYHtyfQojIGNvcnJlbGF0aW9ucyB3aXRob3V0IHN0YW5kYXJkaXppbmc6CmNvcl9xMl9ieXNpdGUgPC0gZF9xMiAlPiUKICBmaWx0ZXIoZ3JlcGwoIl9zZV8iLCBzY2FsZSkgfCBncmVwbCgiX3Bvcl8iLCBzY2FsZSkpICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBzY2FsZSwgc2NvcmUpICU+JQogIHNwcmVhZChzY2FsZSwgc2NvcmUpICU+JQogIGdyb3VwX2J5KHA3X2N0cnkpICU+JQogIHN1bW1hcmlzZSgKICAgIHNlX3RvdGFsLnBvcl90b3RhbCA9IGNvcihwN19zZV90b3RhbCwgcDdfcG9yX3RvdGFsKSwKICAgIHNlX3RvdGFsX3ExdG8xMy5wb3JfdG90YWwgPSBjb3IocDdfc2VfdG90YWxfcTF0bzEzLCBwN19wb3JfdG90YWwpLAogICAgc2VfdG90YWxfcTE0dG8yMS5wb3JfdG90YWwgPSBjb3IocDdfc2VfdG90YWxfcTE0dG8yMSwgcDdfcG9yX3RvdGFsKSkgJT4lCiAgZnVsbF9qb2luKGRfcTIgJT4lCiAgICAgICAgICAgICAgZmlsdGVyKGdyZXBsKCJfc2VfIiwgc2NhbGUpIHwgZ3JlcGwoIl9wb3JfIiwgc2NhbGUpKSAlPiUKICAgICAgICAgICAgICBzZWxlY3QocDdfc3Viaiwgc2NhbGUsIHNjb3JlKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUocDdfY3RyeSA9ICJPVkVSQUxMIikgJT4lCiAgICAgICAgICAgICAgZ3JvdXBfYnkocDdfY3RyeSkgJT4lCiAgICAgICAgICAgICAgc3ByZWFkKHNjYWxlLCBzY29yZSkgJT4lCiAgICAgICAgICAgICAgc3VtbWFyaXNlKAogICAgICAgICAgICAgICAgc2VfdG90YWwucG9yX3RvdGFsID0gY29yKHA3X3NlX3RvdGFsLCBwN19wb3JfdG90YWwpLAogICAgICAgICAgICAgICAgc2VfdG90YWxfcTF0bzEzLnBvcl90b3RhbCA9IGNvcihwN19zZV90b3RhbF9xMXRvMTMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwN19wb3JfdG90YWwpLAogICAgICAgICAgICAgICAgc2VfdG90YWxfcTE0dG8yMS5wb3JfdG90YWwgPSBjb3IocDdfc2VfdG90YWxfcTE0dG8yMSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA3X3Bvcl90b3RhbCkpKSAlPiUKICBnYXRoZXIocGFpciwgciwgLXA3X2N0cnkpICU+JQogIHNlcGFyYXRlKHBhaXIsIGludG8gPSBjKCJ2MSIsICJ2MiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgbXV0YXRlKHA3X2N0cnkgPSBmYWN0b3IocDdfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsICJDaGluYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFudWF0dSIsICJPVkVSQUxMIikpKSAlPiUKICByZW5hbWUoc2FtcGxlID0gcDdfY3RyeSkKYGBgCgpIb3dldmVyLCBpcyB0aGlzIGEgX21lYW5pbmdmdWxfIGRpZmZlcmVuY2U/IFRvIHJlcGVhdCBmcm9tIFF1ZXN0aW9uICMxLCBhYm92ZTogYW4gaW1wb3J0YW50IHRoaW5nIHRvIGtlZXAgaW4gbWluZCBpcyB0aGF0IHRoZSByZWxpYWJpbGl0eSBvZiBhIHNjYWxlIChob3cgc3Ryb25nbHkgaXRzIGl0ZW1zIGFyZSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlcikgYWZmZWN0cyBob3cgc3Ryb25nbHkgY29ycmVsYXRlZCB0aGUgdG90YWwgc2NhbGUgY2FuIGJlIHdpdGggb3RoZXIgbWVhc3VyZXMuIEEgcm91Z2ggcnVsZSBvZiB0aHVtYiBpcyB0aGF0IHRoZSByZWxpYWJpbGl0eSBvZiBhIHNjYWxlIHNldHMgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoYXQgc2NhbGUgYW5kIG90aGVycy4gU2luY2UgdGhlc2UgdHdvIHN1YnNldHMgb2YgU0UgYXJlIGtpbmQgb2YgYWQtaG9jIChhbmQgZGVmaW5pdGVseSBwb3N0LWhvYykgYnJlYWtkb3ducyBvZiBhIHByZS1leGlzdGluZyBzY2FsZSwgdGhpcyBzZWVtcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byBjaGVjayBoZXJlLgoKV2l0aCB0aGlzIGluIG1pbmQsIGxldCdzIGNoZWNrIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgdHdvIHN1YnNldHMgb2YgdGhlIFNFIHNjYWxlLCBhbmQgbG9vayBhdCBob3cgdGhlc2UgY29ycmVsYXRpb25zIHdpdGggUG9yb3NpdHkgKER1bGluKSBzdGFjayB1cCB0byB0aGUgdXBwZXIgbGltaXQgaW1wb3NlZCBieSByZWxpYWJpbGl0eS4uLiBhbmQganVzdCBmb3IgZnVuIEknbGwgdGhyb3cgaW4gdGhlIGNvcnJlbGF0aW9ucyB3aXRoaW4gZWFjaCBzaXRlIGFzIHdlbGwuCgpgYGB7cn0KZF9hbHBoYSA8LSBkYXRhLmZyYW1lKAogIGBTRSAoYWxsIGl0ZW1zKWAgPSBhbHBoYV9ieV9jdHJ5X2Z1bigKICAgIGQwICU+JSBzZWxlY3QocDdfY3RyeSwgY29udGFpbnMoIl9zZV8iKSkgJT4lIHJlbW92ZV9taXNzaW5nKCkpLAogIGBTRSAoIzEtMTMpYCA9IGFscGhhX2J5X2N0cnlfZnVuKAogICAgZDAgJT4lIHNlbGVjdChwN19jdHJ5LCBjb250YWlucygiX3NlXyIpKSAlPiUgcmVtb3ZlX21pc3NpbmcoKSAlPiUKICAgICAgc2VsZWN0KC1jKHA3X3NlX3NoYWtpbmcucHJheWVyLCBwN19zZV9lbW90aW9uLnByYXllciwgIyBxMTQtMTUKICAgICAgICAgICAgICAgIHA3X3NlX3Bvd3JmdWwucHJheWVyLCBwN19zZV9vdXQuYm9keS5leHAsICNxMTYtMTcKICAgICAgICAgICAgICAgIHA3X3NlX2JvZHkuY29udHJvbCwgcDdfc2Vfc2xlcC5wYXJhbHlzaXMsICNxMTgtMTkgCiAgICAgICAgICAgICAgICBwN19zZV9nb2QudGhydS5wYWluLCBwN19zZV9nb2QuaWxsbmVzcykpKSwgI3EyMC0yMQogIGBTRSAoIzE0LTIxKWAgPSBhbHBoYV9ieV9jdHJ5X2Z1bigKICAgIGQwICU+JSBzZWxlY3QocDdfY3RyeSwgCiAgICAgICAgICAgICAgICAgIHA3X3NlX3NoYWtpbmcucHJheWVyLCBwN19zZV9lbW90aW9uLnByYXllciwgIyBxMTQtMTUKICAgICAgICAgICAgICAgIHA3X3NlX3Bvd3JmdWwucHJheWVyLCBwN19zZV9vdXQuYm9keS5leHAsICNxMTYtMTcKICAgICAgICAgICAgICAgIHA3X3NlX2JvZHkuY29udHJvbCwgcDdfc2Vfc2xlcC5wYXJhbHlzaXMsICNxMTgtMTkgCiAgICAgICAgICAgICAgICBwN19zZV9nb2QudGhydS5wYWluLCBwN19zZV9nb2QuaWxsbmVzcykpKSAlPiUgI3EyMC0yMQogIHJvd25hbWVzX3RvX2NvbHVtbigic2FtcGxlIikgJT4lCiAgZ2F0aGVyKHNjYWxlLCByYXdfYWxwaGEsIC1zYW1wbGUpICU+JQogIG11dGF0ZShzYW1wbGUgPSAKICAgICAgICAgICByZWNvZGVfZmFjdG9yKGdzdWIoImFscGhhXyIsICIiLCBzYW1wbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgInVzIiA9ICJVUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiZ2giID0gIkdoYW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0aCIgPSAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgImNoIiA9ICJDaGluYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAidnQiID0gIlZhbnVhdHUiLAogICAgICAgICAgICAgICAgICAgICAgICAgImFsbCIgPSAiT1ZFUkFMTCIpLAogICAgICAgICBzY2FsZSA9IGdzdWIoIlxcLlxcLiQiLCAiKSIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJcXC5cXC4iLCAiICgiLCBzY2FsZSksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiXFwuJCIsICIpIiwgc2NhbGUpLAogICAgICAgICBzY2FsZSA9IGdzdWIoIlxcLiIsICIgIiwgc2NhbGUpLAogICAgICAgICBzY2FsZSA9IGdzdWIoIlxcKCAiLCAiXFwoXFwjIiwgc2NhbGUpLAogICAgICAgICBzY2FsZSA9IGdzdWIoIjEgMTMiLCAiMS0xMyIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCIxNCAyMSIsICIxNC0yMSIsIHNjYWxlKSkgJT4lCiAgbXV0YXRlKHNjYWxlID0gZmFjdG9yKHNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJTRSAoYWxsIGl0ZW1zKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRSAoIzEtMTMpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFICgjMTQtMjEpIikpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40LCBpbmNsdWRlID0gVH0KZF9hbHBoYSAlPiUKICBtdXRhdGUoc2NvcGUgPSBpZmVsc2Uoc2FtcGxlID09ICJPVkVSQUxMIiwgInNpdGUiLCAib3ZlcmFsbCIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzYW1wbGUsIHkgPSByYXdfYWxwaGEsICBjb2xvciA9IHNhbXBsZSwgCiAgICAgICAgICAgICBzaGFwZSA9IHNjb3BlLCBzaXplID0gc2NvcGUpKSArCiAgZmFjZXRfd3JhcCh+IHNjYWxlLCBuY29sID0gNikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuOCwgbHR5ID0gMikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC43LCBsdHkgPSAyLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9wb2ludChkYXRhID0gY29yX3EyX2J5c2l0ZSAlPiUKICAgICAgICAgICAgICAgbXV0YXRlKHNjb3BlID0gaWZlbHNlKHNhbXBsZSA9PSAiT1ZFUkFMTCIsICJzaXRlIiwgIm92ZXJhbGwiKSkgJT4lCiAgICAgICAgICAgICAgIHJlbmFtZShzY2FsZSA9IHYxKSAlPiUKICAgICAgICAgICAgICAgbXV0YXRlKHNjYWxlID0gcmVjb2RlX2ZhY3RvcigKICAgICAgICAgICAgICAgICBzY2FsZSwKICAgICAgICAgICAgICAgICAic2VfdG90YWwiID0gIlNFIChhbGwgaXRlbXMpIiwKICAgICAgICAgICAgICAgICAic2VfdG90YWxfcTE0dG8yMSIgPSAiU0UgKCMxNC0yMSkiLAogICAgICAgICAgICAgICAgICJzZV90b3RhbF9xMXRvMTMiID0gIlNFICgjMS0xMykiKSksCiAgICAgICAgICAgICBhZXMoeSA9IHIpLCBzaGFwZSA9IDksc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYygyLCA0KSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LCAxOCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC4xLCAxKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUmVsaWFiaWxpdHkgYnkgc2l0ZSBhbmQgb3ZlcmFsbCwgYW5kIGNvcnJlbGF0aW9ucyB3aXRoIFBvcm9zaXR5IChEdWxpbikgc2NhbGUiLAogICAgICAgc3VidGl0bGUgPSAiU29saWQgZG90cyBhcmUgcmVsaWFiaWxpdHkgKENyb25iYWNoJ3MgYWxwaGEpIGZvciBlYWNoIHNjYWxlL3N1YnNjYWxlIChhbHBoYSA9IDAuOCBpcyBhIGNsYXNzaWMgY3V0b2ZmIGZvciAnZ29vZCcgcmVsaWFiaWxpdHkpXG5Dcm9zcy1oYXRjaGVzIGFyZSBjb3JyZWxhdGlvbnMgd2l0aCBTcGlyaXR1YWwgRXZlbnRzLCB3aGljaCBpbiB0aGVvcnkgYXJlIGNhcHBlZCBhdCB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIHR3byBzY2FsZXMgaW52b2x2ZWQiLAogICAgICAgeCA9ICJTaXRlIiwgeSA9ICJDcm9uYmFjaCdzIGFscGhhIChyYW5nZTogMC0xKVxuT1IgUGVhcnNvbidzIHIgKHJhbmdlOiAtMSB0byArMSkiKQpgYGAKClRoZSBzb2xpZCBkb3RzIGluIHRoZXNlIHBsb3RzIGlsbHVzdHJhdGUgdGhhdCBTRSBpdGVtcyAjMTQtMjEgKHJpZ2h0bW9zdCBwYW5lbCkgZm9ybWVkIGEgZ2VuZXJhbGx5IGxlc3MgcmVsaWFibGUgInNjYWxlIiB0aGFuIFNFIGl0ZW1zICMxLTEzIChjZW50ZXIp4oCUbm90IHN1cnByaXNpbmcsIHNpbmNlIHNob3J0ZXIgc2NhbGVzIGFyZSBnZW5lcmFsbHkgbGVzcyByZWxpYWJsZS4gVGhpcyBoYXMgdGhlIGltcG9ydGFudCBjb25zZXF1ZW5jZSBvZiBmb3JjaW5nIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGl0ZW1zICMxNC0yMSBhbmQgdGhlIFBvcm9zaXR5IChEdWxpbikgc2NhbGUgaW4gc29tZSBzZW5zZSB0byBiZSB3ZWFrZXIuIAoKR2l2ZW4gdGhpcywgd2hhdCBJJ20gaW50ZXJlc3RlZCBpbiBpcyB3aGV0aGVyIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjcm9zcy1oYXRjaCAodGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGJldHdlZW4gdGhhdCBzY2FsZSBhbmQgUG9yb3NpdHkgKER1bGluKSkgYW5kIHRoZSBzb2xpZCBkb3QgKHRoZSByZWxpYWJpbGl0eSBvZiB0aGF0IHNjYWxlKSBkaWZmZXJzIGFjcm9zcyB0aGUgcGFuZWxzLiBJZiB0aGlzIGRpc3RhbmNlIHdlcmUgZ3JlYXRlciBmb3IgU0UgaXRlbXMgIzE0LTIxLCB0aGlzIHdvdWxkIHN0cmVuZ3RoZW4gbXkgYmVsaWVmIHRoYXQgdGhlc2UgaXRlbXMgd2VyZSBtZWFuaW5nZnVsbHkgbGVzcyBzdHJvbmdseSByZWxhdGVkIHRvIFBvcm9zaXR5IC0gYnV0IHRoYXQncyBub3QgcmVhbGx5IHdoYXQgSSBzZWUgaGVyZS4gSW5zdGVhZCwgaWYgeW91IHRoaW5rIG9mIHJlbGlhYmlsaXR5IGFzIGFuIHVwcGVyIGxpbWl0IGZvciBjb3JyZWxhdGlvbiwgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gY29ycmVsYXRpb25zIHN0YXJ0cyB0byBsb29rIGxpa2UgYW4gYXJ0aWZhY3Qgb2YgZGlmZmVyZW5jZXMgaW4gcmVsaWFiaWxpdHkuCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+S0FSQSdTIENVUlJFTlQgVEFLRS1BV0FZOiBCb3RoIHN1YnNldHMgb2YgU0UgaXRlbXMgd2VyZSBzdHJvbmdseSBjb3JyZWxhdGVkIHdpdGggUG9yb3NpdHkuIFRoZXNlIHJlbGF0aW9uc2hpcHMgd2VyZSBzbGlnaHRseSB3ZWFrZXIgZm9yIFNFIGl0ZW1zICMxNC0yMSwgYnV0IEknbSBub3Qgc3VyZSB0aGVzZSBkaWZmZXJlbmNlcyB3ZXJlIG1lYW5pbmdmdWzigJR0aGV5IG1pZ2h0IHdlbGwgYmUgYW4gYXJ0aWZhY3Qgb2YgdW5kZXJseWluZyBkaWZmZXJlbmNlcyBpbiByZWxpYWJpbGl0eSBhY3Jvc3MgdGhlIHR3byBzdWJzZXRzIG9mIFNFIGl0ZW1zLjwvc3Bhbj4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMgUXVlc3Rpb24gIzM6IEZvY3VzaW5nIG9uIHRoZSBsZXNzIHBlcnNvbmlmaWVkIGV2ZW50cyBmcm9tIHRoZSBQb3Jvc2l0eSAoRHVsaW4pIHNjYWxlCgpUYW55YSdzIHF1ZXN0aW9uOiBfRG8gdGhlc2UgaXRlbXMgZnJvbSB0aGUgRHVsaW4gc2NhbGUgKDIsIDMsIDE2LCAxNywgdGhlIGxlc3MgcGVyc29uaWZpZWQgZXZlbnRzKSBjb3JyZWxhdGUgZGlmZmVyZW50bHkgd2l0aCBzcGlyaXR1YWwgZXZlbnRzIHRoYW4gdGhlIG90aGVyIGl0ZW1zIGNvbnNpZGVyZWQgYXMgYSBncm91cD9fCgpgYGB7cn0KZF9xMyA8LSBkMCAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgY29udGFpbnMoIl9wb3JfIikpICU+JQogIHNlbGVjdCgtY29udGFpbnMoInRvdGFsIiksIC1jb250YWlucygiY2hlY2siKSwgLWVuZHNfd2l0aCgiX2NhdCIpLAogICAgICAgICAtZW5kc193aXRoKCJfYSIpLCAtZW5kc193aXRoKCJfYiIpLCAtZW5kc193aXRoKCJfYyIpKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCBjb250YWlucygiX3Bvcl8iKSkgJT4lCiAgbXV0YXRlKHBvcl9wYXJ0ID0gY2FzZV93aGVuKAogICAgcXVlc3Rpb24gJWluJSBjKCJwN19wb3Jfd2lmaS50aGdzIiwgInA3X3Bvcl9qb2Iud2lzaCIsICMgcTMtMwogICAgICAgICAgICAgICAgICAgICJwN19wb3JfdGhncy5oZWFsIiwgInA3X3Bvcl92aXN1YWxpemF0aW9uIikgfiAjcTE2LTE3CiAgICAgICJwN19wb3JfdG90YWxfbGVzc3BlciIsCiAgICBUUlVFIH4gInA3X3Bvcl90b3RhbF9tb3JlcGVyIikpICU+JSAKICBncm91cF9ieShwN19jdHJ5LCBwN19zdWJqLCBwb3JfcGFydCkgJT4lCiAgc3VtbWFyaXNlKHNjb3JlID0gc3VtKHJlc3BvbnNlLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc3ByZWFkKHBvcl9wYXJ0LCBzY29yZSkgJT4lCiAgbGVmdF9qb2luKGQwICU+JSBzZWxlY3QocDdfc3ViaiwgY29udGFpbnMoInRvdGFsIikpKSAlPiUKICBtdXRhdGVfYXQodmFycygtYyhwN19jdHJ5LCBwN19zdWJqKSksIGZ1bnMoYXMubnVtZXJpYykpICU+JQogIGdhdGhlcihzY2FsZSwgc2NvcmUsIC1jKHA3X2N0cnksIHA3X3N1YmopKSAlPiUKICBncm91cF9ieShzY2FsZSkgJT4lCiAgbXV0YXRlKHNjb3JlX3N0ZCA9IHNjYWxlKHNjb3JlLCBzY2FsZSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc2NhbGUsIHA3X2N0cnkpICU+JQogIG11dGF0ZShzY29yZV9zdGRfYnlzaXRlID0gc2NhbGUoc2NvcmUsIHNjYWxlID0gVCkpICU+JQogIHVuZ3JvdXAoKQpgYGAKCkknbGwgc3RhcnQgYnkgbG9va2luZyBhdCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgbGVzcyBwZXJzb25pZmllZCBQb3Jvc2l0eSBpdGVtcywgdGhlIG1vcmUgcGVyc29uaWZpZWQgUG9yb3NpdHkgaXRlbXMgYW5kIHRoZSBTcGlyaXR1YWwgRXZlbnRzIHRvdGFsIHNjb3JlLiBJJ2xsIGFsc28gaW5jbHVkZSB0aGUgcmVsZXZhbnQgY29ycmVsYXRpb25zIHdpdGggdGhlIFBvcm9zaXR5IHRvdGFsIHNjb3JlIGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjgsIGluY2x1ZGUgPSBUfQojIGNvcnJlbGF0aW9ucyB3aXRob3V0IHN0YW5kYXJkaXppbmc6CmNvcl9xMyA8LSBkX3EzICU+JQogIGZpbHRlcihncmVwbCgiX3NlXyIsIHNjYWxlKSB8IGdyZXBsKCJfcG9yXyIsIHNjYWxlKSkgJT4lCiAgc2VsZWN0KHA3X3N1YmosIHNjYWxlLCBzY29yZSkgJT4lCiAgc3ByZWFkKHNjYWxlLCBzY29yZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJwN19zdWJqIikgJT4lCiAgY29yLmNpKHBsb3QgPSBGKQoKY29yX3EzJHJobyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ2MSIpICU+JQogIGdhdGhlcih2MiwgciwgLXYxKSAlPiUKICBtdXRhdGVfYXQodmFycyh2MSwgdjIpLAogICAgICAgICAgICBmdW5zKHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgICAgLiwKICAgICAgICAgICAgICAicDdfcG9yX3RvdGFsIiA9ICJQb3Jvc2l0eSAoYWxsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgInA3X3Bvcl90b3RhbF9tb3JlcGVyIiA9ICJQb3Jvc2l0eSAobW9yZSBwZXJzb25pZmllZCkiLAogICAgICAgICAgICAgICJwN19wb3JfdG90YWxfbGVzc3BlciIgPSAiUG9yb3NpdHkgKGxlc3MgcGVyc29uaWZpZWQpIiwKICAgICAgICAgICAgICAicDdfc2VfdG90YWwiID0gIlNwaXJpdHVhbCBFdmVudHMiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IHYxLCB5ID0gdjIsIGZpbGwgPSByLCAKICAgICAgICAgICAgIGxhYmVsID0gZm9ybWF0KHJvdW5kKHIsIDIpLCBuc21hbGwgPSAyKSkpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KCkgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDEuNSwgeG1heCA9IDMuNSwgeW1pbiA9IDMuNSwgeW1heCA9IDQuNSwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAxLCBiYXJoZWlnaHQgPSAxMCkpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiQ29ycmVsYXRpb25zIGFtb25nIHN1YnNldHMgb2YgdGhlIFBvcm9zaXR5IChEdWxpbikgc2NhbGUsXG5hbmQgdGhlIFNwaXJpdHVhbCBFdmVudHMgc2NhbGUiLAogICAgICAgc3VidGl0bGUgPSAiTm8gc3RhbmRhcmRpemF0aW9uIiwKICAgICAgIGZpbGwgPSAiUGVhcnNvbidzIHIiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC44LCBpbmNsdWRlID0gRn0KIyAjIGNvcnJlbGF0aW9ucyBhZnRlciBzdGFuZGFyZGl6aW5nIHdpdGhpbiBlYWNoIHNpdGUKIyBjb3JfcTNfc3RkX2J5c2l0ZSA8LSBkX3EzICU+JQojICAgZmlsdGVyKGdyZXBsKCJfc2VfIiwgc2NhbGUpIHwgZ3JlcGwoIl9wb3JfIiwgc2NhbGUpKSAlPiUKIyAgIGdyb3VwX2J5KHA3X2N0cnksIHNjYWxlKSAlPiUKIyAgIG11dGF0ZShzY29yZSA9IHNjYWxlKHNjb3JlLCBzY2FsZSA9IFQpKSAlPiUKIyAgIHVuZ3JvdXAoKSAlPiUKIyAgIHNlbGVjdChwN19zdWJqLCBzY2FsZSwgc2NvcmUpICU+JQojICAgc3ByZWFkKHNjYWxlLCBzY29yZSkgJT4lCiMgICBjb2x1bW5fdG9fcm93bmFtZXMoInA3X3N1YmoiKSAlPiUKIyAgIGNvci5jaShwbG90ID0gRikKIyAKIyBjb3JfcTNfc3RkX2J5c2l0ZSRyaG8gJT4lCiMgICBkYXRhLmZyYW1lKCkgJT4lCiMgICByb3duYW1lc190b19jb2x1bW4oInYxIikgJT4lCiMgICBnYXRoZXIodjIsIHIsIC12MSkgJT4lCiMgICBtdXRhdGVfYXQodmFycyh2MSwgdjIpLAojICAgICAgICAgICAgIGZ1bnMocmVjb2RlX2ZhY3RvcigKIyAgICAgICAgICAgICAgIC4sCiMgICAgICAgICAgICAgICAicDdfcG9yX3RvdGFsIiA9ICJQb3Jvc2l0eSAoYWxsIGl0ZW1zKSIsCiMgICAgICAgICAgICAgICAicDdfcG9yX3RvdGFsX21vcmVwZXIiID0gIlBvcm9zaXR5IChtb3JlIHBlcnNvbmlmaWVkKSIsCiMgICAgICAgICAgICAgICAicDdfcG9yX3RvdGFsX2xlc3NwZXIiID0gIlBvcm9zaXR5IChsZXNzIHBlcnNvbmlmaWVkKSIsCiMgICAgICAgICAgICAgICAicDdfc2VfdG90YWwiID0gIlNwaXJpdHVhbCBFdmVudHMiKSkpICU+JQojICAgZ2dwbG90KGFlcyh4ID0gdjEsIHkgPSB2MiwgZmlsbCA9IHIsIAojICAgICAgICAgICAgICBsYWJlbCA9IGZvcm1hdChyb3VuZChyLCAyKSwgbnNtYWxsID0gMikpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICBnZW9tX3RleHQoKSArCiMgICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxLjUsIHhtYXggPSAzLjUsIHltaW4gPSAzLjUsIHltYXggPSA0LjUsCiMgICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsKIyAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMSwgYmFyaGVpZ2h0ID0gMTApKSArCiMgICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiMgICBsYWJzKHRpdGxlID0gIkNvcnJlbGF0aW9ucyBhbW9uZyBzdWJzZXRzIG9mIHRoZSBQb3Jvc2l0eSAoRHVsaW4pIHNjYWxlLFxuYW5kIHRoZSBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlIiwKIyAgICAgICAgc3VidGl0bGUgPSAiQWZ0ZXIgc3RhbmRhcmRpemluZyB3aXRoaW4gZWFjaCBzaXRlIiwKIyAgICAgICAgZmlsbCA9ICJQZWFyc29uJ3MgciIpCmBgYAoKX19Db3JyZWxhdGlvbnMgd2l0aCBTcGlyaXR1YWwgRXZlbnRzXzoKCi0gVGhlIGxlc3MgcGVyc29uaWZpZWQgc3ViZXN0IG9mIFBvcm9zaXR5IGl0ZW1zIHdhcyBtb2RlcmF0ZWx5IGNvcnJlbGF0ZWQgd2l0aCB0aGUgU3Bpcml0dWFsIEV2ZW50cyB0b3RhbCBzY29yZSAociA9IGByIHJvdW5kKGNvcl9xMyRyaG9bInA3X3Bvcl90b3RhbF9sZXNzcGVyIiwgInA3X3NlX3RvdGFsIl0sIDIpYCwgOTUlIENJOiBbYHIgcm91bmQoY29yX3EzJGNpWyJwN19wcl90dGxfbC1wN19zXyIsICJsb3cuZSJdLCAyKWAsIGByIHJvdW5kKGNvcl9xMyRjaVsicDdfcHJfdHRsX2wtcDdfc18iLCAidXAuZSJdLCAyKWBdLCBwID0gYHIgcm91bmQoY29yX3EzJGNpWyJwN19wcl90dGxfbC1wN19zXyIsICJwIl0sIDIpYCkuIAotIE51bWVyaWNhbGx5IHNwZWFraW5nLCB0aGlzIGNvcnJlbGF0aW9uIGFwcGVhcnMgdG8gYmUgd2Vha2VyIHRoYW4gdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIG90aGVyIHN1YnNldCBvZiBTRSBpdGVtcyAoIzEtMTMpIGFuZCBQb3Jvc2l0eSAoRHVsaW4pIChyID0gYHIgcm91bmQoY29yX3EzJHJob1sicDdfcG9yX3RvdGFsX21vcmVwZXIiLCAicDdfc2VfdG90YWwiXSwgMilgLCA5NSUgQ0k6IFtgciByb3VuZChjb3JfcTMkY2lbInA3X3ByX3R0bF9tLXA3X3NfIiwgImxvdy5lIl0sIDIpYCwgYHIgcm91bmQoY29yX3EzJGNpWyJwN19wcl90dGxfbS1wN19zXyIsICJ1cC5lIl0sIDIpYF0sIHAgPSBgciByb3VuZChjb3JfcTMkY2lbInA3X3ByX3R0bF9tLXA3X3NfIiwgInAiXSwgMilgKS4KCmBgYHtyfQojIGNvcnJlbGF0aW9ucyB3aXRob3V0IHN0YW5kYXJkaXppbmc6CmNvcl9xM19ieXNpdGUgPC0gZF9xMyAlPiUKICBmaWx0ZXIoZ3JlcGwoIl9zZV8iLCBzY2FsZSkgfCBncmVwbCgiX3Bvcl8iLCBzY2FsZSkpICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBzY2FsZSwgc2NvcmUpICU+JQogIHNwcmVhZChzY2FsZSwgc2NvcmUpICU+JQogIGdyb3VwX2J5KHA3X2N0cnkpICU+JQogIHN1bW1hcmlzZSgKICAgIHBvcl90b3RhbC5zZV90b3RhbCA9IGNvcihwN19wb3JfdG90YWwsIHA3X3NlX3RvdGFsKSwKICAgIHBvcl90b3RhbF9tb3JlcGVyLnNlX3RvdGFsID0gY29yKHA3X3Bvcl90b3RhbF9tb3JlcGVyLCBwN19zZV90b3RhbCksCiAgICBwb3JfdG90YWxfbGVzc3Blci5zZV90b3RhbCA9IGNvcihwN19wb3JfdG90YWxfbGVzc3BlciwgcDdfc2VfdG90YWwpKSAlPiUKICBmdWxsX2pvaW4oZF9xMyAlPiUKICAgICAgICAgICAgICBmaWx0ZXIoZ3JlcGwoIl9zZV8iLCBzY2FsZSkgfCBncmVwbCgiX3Bvcl8iLCBzY2FsZSkpICU+JQogICAgICAgICAgICAgIHNlbGVjdChwN19zdWJqLCBzY2FsZSwgc2NvcmUpICU+JQogICAgICAgICAgICAgIG11dGF0ZShwN19jdHJ5ID0gIk9WRVJBTEwiKSAlPiUKICAgICAgICAgICAgICBncm91cF9ieShwN19jdHJ5KSAlPiUKICAgICAgICAgICAgICBzcHJlYWQoc2NhbGUsIHNjb3JlKSAlPiUKICAgICAgICAgICAgICBzdW1tYXJpc2UoCiAgICAgICAgICAgICAgICBwb3JfdG90YWwuc2VfdG90YWwgPSBjb3IocDdfcG9yX3RvdGFsLCBwN19zZV90b3RhbCksCiAgICAgICAgICAgICAgICBwb3JfdG90YWxfbW9yZXBlci5zZV90b3RhbCA9IGNvcihwN19wb3JfdG90YWxfbW9yZXBlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwN19zZV90b3RhbCksCiAgICAgICAgICAgICAgICBwb3JfdG90YWxfbGVzc3Blci5zZV90b3RhbCA9IGNvcihwN19wb3JfdG90YWxfbGVzc3BlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwN19zZV90b3RhbCkpKSAlPiUKICBnYXRoZXIocGFpciwgciwgLXA3X2N0cnkpICU+JQogIHNlcGFyYXRlKHBhaXIsIGludG8gPSBjKCJ2MSIsICJ2MiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgbXV0YXRlKHA3X2N0cnkgPSBmYWN0b3IocDdfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsICJDaGluYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFudWF0dSIsICJPVkVSQUxMIikpKSAlPiUKICByZW5hbWUoc2FtcGxlID0gcDdfY3RyeSkKYGBgCgpIb3dldmVyLCBpcyB0aGlzIGEgX21lYW5pbmdmdWxfIGRpZmZlcmVuY2U/IFRvIHJlcGVhdCBmcm9tIFF1ZXN0aW9ucyAjMS0yLCBhYm92ZTogYW4gaW1wb3J0YW50IHRoaW5nIHRvIGtlZXAgaW4gbWluZCBpcyB0aGF0IHRoZSByZWxpYWJpbGl0eSBvZiBhIHNjYWxlIChob3cgc3Ryb25nbHkgaXRzIGl0ZW1zIGFyZSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlcikgYWZmZWN0cyBob3cgc3Ryb25nbHkgY29ycmVsYXRlZCB0aGUgdG90YWwgc2NhbGUgY2FuIGJlIHdpdGggb3RoZXIgbWVhc3VyZXMuIEEgcm91Z2ggcnVsZSBvZiB0aHVtYiBpcyB0aGF0IHRoZSByZWxpYWJpbGl0eSBvZiBhIHNjYWxlIHNldHMgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoYXQgc2NhbGUgYW5kIG90aGVycy4gU2luY2UgdGhlc2UgdHdvIHN1YnNldHMgb2YgUG9yb3NpdHkgYXJlIGtpbmQgb2YgYWQtaG9jIChhbmQgZGVmaW5pdGVseSBwb3N0LWhvYykgYnJlYWtkb3ducyBvZiBhIHByZS1leGlzdGluZyBzY2FsZSwgdGhpcyBzZWVtcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byBjaGVjayBoZXJlLgoKV2l0aCB0aGlzIGluIG1pbmQsIGxldCdzIGNoZWNrIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgdHdvIHN1YnNldHMgb2YgdGhlIFBvcm9zaXR5IHNjYWxlLCBhbmQgbG9vayBhdCBob3cgdGhlc2UgY29ycmVsYXRpb25zIHdpdGggU3Bpcml0dWFsIEV2ZW50cyBzdGFjayB1cCB0byB0aGUgdXBwZXIgbGltaXQgaW1wb3NlZCBieSByZWxpYWJpbGl0eS4uLiBhbmQganVzdCBmb3IgZnVuIEknbGwgdGhyb3cgaW4gdGhlIGNvcnJlbGF0aW9ucyB3aXRoaW4gZWFjaCBzaXRlIGFzIHdlbGwuCgpgYGB7cn0KZF9hbHBoYSA8LSBkYXRhLmZyYW1lKAogIGBQb3Jvc2l0eSAoYWxsIGl0ZW1zKWAgPSBhbHBoYV9ieV9jdHJ5X2Z1bigKICAgIGQwICU+JSBzZWxlY3QocDdfY3RyeSwgY29udGFpbnMoIl9wb3JfIikpKSwKICBgUG9yb3NpdHkgKG1vcmUgcGVyc29uaWZpZWQpYCA9IGFscGhhX2J5X2N0cnlfZnVuKAogICAgZDAgJT4lIHNlbGVjdChwN19jdHJ5LCBjb250YWlucygiX3Bvcl8iKSkgJT4lCiAgICAgIHNlbGVjdCgtYyhwN19wb3Jfd2lmaS50aGdzLCBwN19wb3Jfam9iLndpc2gsICMgcTMtMwogICAgICAgICAgICAgICAgcDdfcG9yX3RoZ3MuaGVhbCwgcDdfcG9yX3Zpc3VhbGl6YXRpb24pKSksICNxMTYtMTcKICBgUG9yb3NpdHkgKGxlc3MgcGVyc29uaWZpZWQpYCA9IGFscGhhX2J5X2N0cnlfZnVuKAogICAgZDAgJT4lIHNlbGVjdChwN19jdHJ5LCAKICAgICAgICAgICAgICAgICAgcDdfcG9yX3dpZmkudGhncywgcDdfcG9yX2pvYi53aXNoLCAjIHEzLTMKICAgICAgICAgICAgICAgICAgcDdfcG9yX3RoZ3MuaGVhbCwgcDdfcG9yX3Zpc3VhbGl6YXRpb24pKSkgJT4lICNxMTYtMTcKICByb3duYW1lc190b19jb2x1bW4oInNhbXBsZSIpICU+JQogIGdhdGhlcihzY2FsZSwgcmF3X2FscGhhLCAtc2FtcGxlKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gCiAgICAgICAgICAgcmVjb2RlX2ZhY3Rvcihnc3ViKCJhbHBoYV8iLCAiIiwgc2FtcGxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJ1cyIgPSAiVVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgImdoIiA9ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAidGgiID0gIlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJjaCIgPSAiQ2hpbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgInZ0IiA9ICJWYW51YXR1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICJhbGwiID0gIk9WRVJBTEwiKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJcXC5cXC4kIiwgIikiLCBzY2FsZSksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiXFwuXFwuIiwgIiAoIiwgc2NhbGUpLAogICAgICAgICBzY2FsZSA9IGdzdWIoIlxcLiQiLCAiKSIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJcXC4iLCAiICIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJcXCggIiwgIlxcKFxcIyIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCIxIDEzIiwgIjEtMTMiLCBzY2FsZSksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiMTQgMjEiLCAiMTQtMjEiLCBzY2FsZSkpICU+JQogIG11dGF0ZShzY2FsZSA9IGZhY3RvcihzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiUG9yb3NpdHkgKGFsbCBpdGVtcykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9yb3NpdHkgKG1vcmUgcGVyc29uaWZpZWQpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcm9zaXR5IChsZXNzIHBlcnNvbmlmaWVkKSIpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNCwgaW5jbHVkZSA9IFR9CmRfYWxwaGEgJT4lCiAgbXV0YXRlKHNjb3BlID0gaWZlbHNlKHNhbXBsZSA9PSAiT1ZFUkFMTCIsICJzaXRlIiwgIm92ZXJhbGwiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2FtcGxlLCB5ID0gcmF3X2FscGhhLCAgY29sb3IgPSBzYW1wbGUsIAogICAgICAgICAgICAgc2hhcGUgPSBzY29wZSwgc2l6ZSA9IHNjb3BlKSkgKwogIGZhY2V0X3dyYXAofiBzY2FsZSwgbmNvbCA9IDYpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjgsIGx0eSA9IDIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNywgbHR5ID0gMiwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnQoZGF0YSA9IGNvcl9xM19ieXNpdGUgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZShzY29wZSA9IGlmZWxzZShzYW1wbGUgPT0gIk9WRVJBTEwiLCAic2l0ZSIsICJvdmVyYWxsIikpICU+JQogICAgICAgICAgICAgICByZW5hbWUoc2NhbGUgPSB2MSkgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZShzY2FsZSA9IHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgICAgICAgc2NhbGUsCiAgICAgICAgICAgICAgICAgInBvcl90b3RhbCIgPSAiUG9yb3NpdHkgKGFsbCBpdGVtcykiLAogICAgICAgICAgICAgICAgICJwb3JfdG90YWxfbW9yZXBlciIgPSAiUG9yb3NpdHkgKG1vcmUgcGVyc29uaWZpZWQpIiwKICAgICAgICAgICAgICAgICAicG9yX3RvdGFsX2xlc3NwZXIiID0gIlBvcm9zaXR5IChsZXNzIHBlcnNvbmlmaWVkKSIpKSwKICAgICAgICAgICAgIGFlcyh5ID0gciksIHNoYXBlID0gOSxzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDIsIDQpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsIDE4KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjEsIDEpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJSZWxpYWJpbGl0eSBieSBzaXRlIGFuZCBvdmVyYWxsLCBhbmQgY29ycmVsYXRpb25zIHdpdGggU3Bpcml0dWFsIEV2ZW50cyBzY2FsZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJTb2xpZCBkb3RzIGFyZSByZWxpYWJpbGl0eSAoQ3JvbmJhY2gncyBhbHBoYSkgZm9yIGVhY2ggc2NhbGUvc3Vic2NhbGUgKGFscGhhID0gMC44IGlzIGEgY2xhc3NpYyBjdXRvZmYgZm9yICdnb29kJyByZWxpYWJpbGl0eSlcbkNyb3NzLWhhdGNoZXMgYXJlIGNvcnJlbGF0aW9ucyB3aXRoIFNwaXJpdHVhbCBFdmVudHMsIHdoaWNoIGluIHRoZW9yeSBhcmUgY2FwcGVkIGF0IHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgdHdvIHNjYWxlcyBpbnZvbHZlZCIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIkNyb25iYWNoJ3MgYWxwaGEgKHJhbmdlOiAwLTEpXG5PUiBQZWFyc29uJ3MgciAocmFuZ2U6IC0xIHRvICsxKSIpCmBgYAoKVGhlIHNvbGlkIGRvdHMgaW4gdGhlc2UgcGxvdHMgaWxsdXN0cmF0ZSB0aGF0IHRoZSBsZXNzIHBlcnNvbmlmaWVkIFBvcm9zaXR5IGl0ZW1zIChyaWdodG1vc3QgcGFuZWwpIGZvcm1lZCBhIGdlbmVyYWxseSBtdWNoIGxlc3MgcmVsaWFibGUgInNjYWxlIiB0aGFuIHRoZSBtb3JlIHBlcnNvbmlmaWVkIFBvcm9zaXR5IGl0ZW1zIChjZW50ZXIp4oCUbm90IHN1cnByaXNpbmcsIHNpbmNlIHNob3J0ZXIgc2NhbGVzIGFyZSBnZW5lcmFsbHkgbGVzcyByZWxpYWJsZS4gVGhpcyBoYXMgdGhlIGltcG9ydGFudCBjb25zZXF1ZW5jZSBvZiBmb3JjaW5nIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBsZXNzIHBlcnNvbmlmaWVkIGl0ZW1zIGFuZCB0aGUgU3Bpcml0dWFsIEV2ZW50cyBzY2FsZSBpbiBzb21lIHNlbnNlIHRvIGJlIHdlYWtlci4gCgpHaXZlbiB0aGlzLCB3aGF0IEknbSBpbnRlcmVzdGVkIGluIGlzIHdoZXRoZXIgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNyb3NzLWhhdGNoICh0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgYmV0d2VlbiB0aGF0IHNjYWxlIGFuZCBTcGlydHVhbCBFdmVudHMpIGFuZCB0aGUgc29saWQgZG90ICh0aGUgcmVsaWFiaWxpdHkgb2YgdGhhdCBzY2FsZSkgZGlmZmVycyBhY3Jvc3MgdGhlIHBhbmVscy4gSWYgdGhpcyBkaXN0YW5jZSB3ZXJlIGdyZWF0ZXIgZm9yIHRoZSBsZXNzIHBlcnNvbmlmaWVkIFBvcm9zaXR5IGl0ZW1zLCB0aGlzIHdvdWxkIHN0cmVuZ3RoZW4gbXkgYmVsaWVmIHRoYXQgdGhlc2UgaXRlbXMgd2VyZSBtZWFuaW5nZnVsbHkgbGVzcyBzdHJvbmdseSByZWxhdGVkIHRvIFNwaXJpdHVhbCBFdmVudHMgLSBidXQgdGhhdCdzIG5vdCByZWFsbHkgd2hhdCBJIHNlZSBoZXJlLiBJbnN0ZWFkLCBpZiB5b3UgdGhpbmsgb2YgcmVsaWFiaWxpdHkgYXMgYW4gdXBwZXIgbGltaXQgZm9yIGNvcnJlbGF0aW9uLCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb3JyZWxhdGlvbnMgc3RhcnRzIHRvIGxvb2sgbGlrZSBhbiBhcnRpZmFjdCBvZiBkaWZmZXJlbmNlcyBpbiByZWxpYWJpbGl0eS4gKElmIGFueXRoaW5nLCB0aGUgcmV2ZXJzZSBtaWdodCBiZSB0cnVlIC0gdGhlc2UgaXRlbXMgbWlnaHQgYmUgY2xvc2VyIHRvIHRoZSBjZWlsaW5nIGZvciBjb3JyZWxhdGlvbj8pCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+S0FSQSdTIENVUlJFTlQgVEFLRS1BV0FZOiBCb3RoIHN1YnNldHMgb2YgUG9yb3NpdHkgaXRlbXMgd2VyZSBjb3JyZWxhdGVkIHdpdGggU3Bpcml0dWFsIEV2ZW50cy4gVGhlc2UgcmVsYXRpb25zaGlwcyB3ZXJlIHdlYWtlciBmb3IgdGhlIGxlc3MgcGVyc29uaWZpZWQgUG9yb3NpdHkgaXRlbXMsIGJ1dCBJJ20gbm90IHN1cmUgdGhlc2UgZGlmZmVyZW5jZXMgd2VyZSBtZWFuaW5nZnVs4oCUdGhleSBtaWdodCB3ZWxsIGJlIGFuIGFydGlmYWN0IG9mIHVuZGVybHlpbmcgZGlmZmVyZW5jZXMgaW4gcmVsaWFiaWxpdHkgYWNyb3NzIHRoZSB0d28gc3Vic2V0cyBvZiBQb3Jvc2l0eSBpdGVtcy48L3NwYW4+CgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIFF1ZXN0aW9uICM0OiBGb2N1c2luZyBvbiB0aGUgcHVyZXN0IHBvcm9zaXR5IGV2ZW50cyBmcm9tIHRoZSBNYXJ0aGEgU3Rvcnkgc2NhbGUKClRhbnlhJ3MgcXVlc3Rpb246IF9DYW4gd2Ugc3VtIE1hcnRoYSBNYXJ5IDFiLCAxZSwgMmIsIDJlLCAzYiwgM2UgYW5kIHNlZSB3aGV0aGVyIHRoZXNlIOKAnHB1cmXigJ0gcG9yb3NpdHkgZXZlbnRzIHN0aWxsIHByZWRpY3Qgc3Bpcml0dWFsIGV2ZW50cz9fCgpCT09LTUFSSwoKYGBge3J9CmRfcTQgPC0gZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIGNvbnRhaW5zKCJfbW1fIikpICU+JQogIHNlbGVjdCgtY29udGFpbnMoInRvdGFsIiksIC1jb250YWlucygiY2hlY2siKSwgLWVuZHNfd2l0aCgiX2NhdCIpLAogICAgICAgICAtZW5kc193aXRoKCJfYSIpLCAtZW5kc193aXRoKCJfYiIpLCAtZW5kc193aXRoKCJfYyIpKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHJlc3BvbnNlLCBjb250YWlucygiX21tXyIpKSAlPiUKICBtdXRhdGUocG9yX3BhcnQgPSBjYXNlX3doZW4oCiAgICBxdWVzdGlvbiAlaW4lIGMoInA3X21tX2FuZ190aGdzLmh1cnQiLCAicDdfbW1fYW5nX3NpY2tuZXNzIiwgIyBxMWIsIDFlCiAgICAgICAgICAgICAgICAgICAgInA3X21tX2Nhcl90aGsubm8ucHIiLCAicDdfbW1fY2FyX2N1cmluZyIsICNxMmIsIDJlCiAgICAgICAgICAgICAgICAgICAgInA3X21tX2Vudl90aGdzLmh1cnQiLCAicDdfbW1fZW52X3NpY2tuZXNzIikgfiAjcTNiLCAzZQogICAgICAicDdfbW1fdG90YWxfcHVyZSIsCiAgICBUUlVFIH4gInA3X21tX3RvdGFsX290aGVyIikpICU+JSAKICBncm91cF9ieShwN19jdHJ5LCBwN19zdWJqLCBwb3JfcGFydCkgJT4lCiAgc3VtbWFyaXNlKHNjb3JlID0gc3VtKHJlc3BvbnNlLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc3ByZWFkKHBvcl9wYXJ0LCBzY29yZSkgJT4lCiAgbGVmdF9qb2luKGQwICU+JSBzZWxlY3QocDdfc3ViaiwgY29udGFpbnMoInRvdGFsIikpKSAlPiUKICBtdXRhdGVfYXQodmFycygtYyhwN19jdHJ5LCBwN19zdWJqKSksIGZ1bnMoYXMubnVtZXJpYykpICU+JQogIGdhdGhlcihzY2FsZSwgc2NvcmUsIC1jKHA3X2N0cnksIHA3X3N1YmopKSAlPiUKICBncm91cF9ieShzY2FsZSkgJT4lCiAgbXV0YXRlKHNjb3JlX3N0ZCA9IHNjYWxlKHNjb3JlLCBzY2FsZSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc2NhbGUsIHA3X2N0cnkpICU+JQogIG11dGF0ZShzY29yZV9zdGRfYnlzaXRlID0gc2NhbGUoc2NvcmUsIHNjYWxlID0gVCkpICU+JQogIHVuZ3JvdXAoKQpgYGAKCkknbGwgc3RhcnQgYnkgbG9va2luZyBhdCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgcHVyZSBNYXJ0aGEgU3RvcnkgaXRlbXMsIHRoZSBvdGhlciBNYXJ0aGEgU3RvcnkgaXRlbXMgYW5kIHRoZSBTcGlyaXR1YWwgRXZlbnRzIHRvdGFsIHNjb3JlLiBJJ2xsIGFsc28gaW5jbHVkZSB0aGUgcmVsZXZhbnQgY29ycmVsYXRpb25zIHdpdGggdGhlIE1hcnRoYSBTdG9yeSB0b3RhbCBzY29yZSBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC44LCBpbmNsdWRlID0gVH0KIyBjb3JyZWxhdGlvbnMgd2l0aG91dCBzdGFuZGFyZGl6aW5nOgpjb3JfcTQgPC0gZF9xNCAlPiUKICBmaWx0ZXIoZ3JlcGwoIl9zZV8iLCBzY2FsZSkgfCBncmVwbCgiX21tXyIsIHNjYWxlKSkgJT4lCiAgc2VsZWN0KHA3X3N1YmosIHNjYWxlLCBzY29yZSkgJT4lCiAgc3ByZWFkKHNjYWxlLCBzY29yZSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJwN19zdWJqIikgJT4lCiAgY29yLmNpKHBsb3QgPSBGKQoKY29yX3E0JHJobyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJ2MSIpICU+JQogIGdhdGhlcih2MiwgciwgLXYxKSAlPiUKICBtdXRhdGVfYXQodmFycyh2MSwgdjIpLAogICAgICAgICAgICBmdW5zKHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgICAgLiwKICAgICAgICAgICAgICAicDdfbW1fdG90YWwiID0gIk1hcnRoYSBTdG9yeSAoYWxsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgInA3X21tX3RvdGFsX290aGVyIiA9ICJNYXJ0aGEgU3RvcnkgKG90aGVyKSIsCiAgICAgICAgICAgICAgInA3X21tX3RvdGFsX3B1cmUiID0gIk1hcnRoYSBTdG9yeSAocHVyZSkiLAogICAgICAgICAgICAgICJwN19zZV90b3RhbCIgPSAiU3Bpcml0dWFsIEV2ZW50cyIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdjEsIHkgPSB2MiwgZmlsbCA9IHIsIAogICAgICAgICAgICAgbGFiZWwgPSBmb3JtYXQocm91bmQociwgMiksIG5zbWFsbCA9IDIpKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMS41LCB4bWF4ID0gMy41LCB5bWluID0gMy41LCB5bWF4ID0gNC41LAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDEsIGJhcmhlaWdodCA9IDEwKSkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJDb3JyZWxhdGlvbnMgYW1vbmcgc3Vic2V0cyBvZiB0aGUgTWFydGhhIFN0b3J5IHNjYWxlLFxuYW5kIHRoZSBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlIiwKICAgICAgIHN1YnRpdGxlID0gIk5vIHN0YW5kYXJkaXphdGlvbiIsCiAgICAgICBmaWxsID0gIlBlYXJzb24ncyByIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOCwgaW5jbHVkZSA9IEZ9CiMgIyBjb3JyZWxhdGlvbnMgYWZ0ZXIgc3RhbmRhcmRpemluZyB3aXRoaW4gZWFjaCBzaXRlCiMgY29yX3E0X3N0ZF9ieXNpdGUgPC0gZF9xNCAlPiUKIyAgIGZpbHRlcihncmVwbCgiX3NlXyIsIHNjYWxlKSB8IGdyZXBsKCJfbW1fIiwgc2NhbGUpKSAlPiUKIyAgIGdyb3VwX2J5KHA3X2N0cnksIHNjYWxlKSAlPiUKIyAgIG11dGF0ZShzY29yZSA9IHNjYWxlKHNjb3JlLCBzY2FsZSA9IFQpKSAlPiUKIyAgIHVuZ3JvdXAoKSAlPiUKIyAgIHNlbGVjdChwN19zdWJqLCBzY2FsZSwgc2NvcmUpICU+JQojICAgc3ByZWFkKHNjYWxlLCBzY29yZSkgJT4lCiMgICBjb2x1bW5fdG9fcm93bmFtZXMoInA3X3N1YmoiKSAlPiUKIyAgIGNvci5jaShwbG90ID0gRikKIyAKIyBjb3JfcTRfc3RkX2J5c2l0ZSRyaG8gJT4lCiMgICBkYXRhLmZyYW1lKCkgJT4lCiMgICByb3duYW1lc190b19jb2x1bW4oInYxIikgJT4lCiMgICBnYXRoZXIodjIsIHIsIC12MSkgJT4lCiMgICBtdXRhdGVfYXQodmFycyh2MSwgdjIpLAojICAgICAgICAgICAgIGZ1bnMocmVjb2RlX2ZhY3RvcigKIyAgICAgICAgICAgICAgIC4sCiMgICAgICAgICAgICAgICAicDdfbW1fdG90YWwiID0gIk1hcnRoYSBTdG9yeSAoYWxsIGl0ZW1zKSIsCiMgICAgICAgICAgICAgICAicDdfbW1fdG90YWxfb3RoZXIiID0gIk1hcnRoYSBTdG9yeSAob3RoZXIpIiwKIyAgICAgICAgICAgICAgICJwN19tbV90b3RhbF9wdXJlIiA9ICJNYXJ0aGEgU3RvcnkgKHB1cmUpIiwKIyAgICAgICAgICAgICAgICJwN19zZV90b3RhbCIgPSAiU3Bpcml0dWFsIEV2ZW50cyIpKSkgJT4lCiMgICBnZ3Bsb3QoYWVzKHggPSB2MSwgeSA9IHYyLCBmaWxsID0gciwKIyAgICAgICAgICAgICAgbGFiZWwgPSBmb3JtYXQocm91bmQociwgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwojICAgZ2VvbV90ZXh0KCkgKwojICAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMS41LCB4bWF4ID0gMy41LCB5bWluID0gMy41LCB5bWF4ID0gNC41LAojICAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDEsIGJhcmhlaWdodCA9IDEwKSkgKwojICAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwojICAgbGFicyh0aXRsZSA9ICJDb3JyZWxhdGlvbnMgYW1vbmcgc3Vic2V0cyBvZiB0aGUgTWFydGhhIFN0b3J5IHNjYWxlLFxuYW5kIHRoZSBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlIiwKIyAgICAgICAgc3VidGl0bGUgPSAiQWZ0ZXIgc3RhbmRhcmRpemluZyB3aXRoaW4gZWFjaCBzaXRlIiwKIyAgICAgICAgZmlsbCA9ICJQZWFyc29uJ3MgciIpCmBgYAoKX19Db3JyZWxhdGlvbnMgd2l0aCBTcGlyaXR1YWwgRXZlbnRzXzoKCi0gVGhlIHB1cmUgc3ViZXN0IG9mIE1hcnRoYSBTdG9yeSBpdGVtcyB3YXMgbW9kZXJhdGVseSBjb3JyZWxhdGVkIHdpdGggdGhlIFNwaXJpdHVhbCBFdmVudHMgdG90YWwgc2NvcmUgKHIgPSBgciByb3VuZChjb3JfcTQkcmhvWyJwN19tbV90b3RhbF9wdXJlIiwgInA3X3NlX3RvdGFsIl0sIDIpYCwgOTUlIENJOiBbYHIgcm91bmQoY29yX3E0JGNpWyJwN19wcl90dGxfbC1wN19zXyIsICJsb3cuZSJdLCAyKWAsIGByIHJvdW5kKGNvcl9xNCRjaVsicDdfcHJfdHRsX2wtcDdfc18iLCAidXAuZSJdLCAyKWBdLCBwID0gYHIgcm91bmQoY29yX3E0JGNpWyJwN19wcl90dGxfbC1wN19zXyIsICJwIl0sIDIpYCkuIAotIE51bWVyaWNhbGx5IHNwZWFraW5nLCB0aGlzIGNvcnJlbGF0aW9uIGFwcGVhcnMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBvdGhlciBzdWJzZXQgb2YgU0UgaXRlbXMgKCMxLTEzKSBhbmQgTWFydGhhIFN0b3J5IChyID0gYHIgcm91bmQoY29yX3E0JHJob1sicDdfbW1fdG90YWxfb3RoZXIiLCAicDdfc2VfdG90YWwiXSwgMilgLCA5NSUgQ0k6IFtgciByb3VuZChjb3JfcTQkY2lbInA3X3ByX3R0bF9tLXA3X3NfIiwgImxvdy5lIl0sIDIpYCwgYHIgcm91bmQoY29yX3E0JGNpWyJwN19wcl90dGxfbS1wN19zXyIsICJ1cC5lIl0sIDIpYF0sIHAgPSBgciByb3VuZChjb3JfcTQkY2lbInA3X3ByX3R0bF9tLXA3X3NfIiwgInAiXSwgMilgKS4KCmBgYHtyfQojIGNvcnJlbGF0aW9ucyB3aXRob3V0IHN0YW5kYXJkaXppbmc6CmNvcl9xNF9ieXNpdGUgPC0gZF9xNCAlPiUKICBmaWx0ZXIoZ3JlcGwoIl9zZV8iLCBzY2FsZSkgfCBncmVwbCgiX21tXyIsIHNjYWxlKSkgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIHNjYWxlLCBzY29yZSkgJT4lCiAgc3ByZWFkKHNjYWxlLCBzY29yZSkgJT4lCiAgZ3JvdXBfYnkocDdfY3RyeSkgJT4lCiAgc3VtbWFyaXNlKAogICAgcG9yX3RvdGFsLnNlX3RvdGFsID0gY29yKHA3X21tX3RvdGFsLCBwN19zZV90b3RhbCksCiAgICBwb3JfdG90YWxfb3RoZXIuc2VfdG90YWwgPSBjb3IocDdfbW1fdG90YWxfb3RoZXIsIHA3X3NlX3RvdGFsKSwKICAgIHBvcl90b3RhbF9wdXJlLnNlX3RvdGFsID0gY29yKHA3X21tX3RvdGFsX3B1cmUsIHA3X3NlX3RvdGFsKSkgJT4lCiAgZnVsbF9qb2luKGRfcTQgJT4lCiAgICAgICAgICAgICAgZmlsdGVyKGdyZXBsKCJfc2VfIiwgc2NhbGUpIHwgZ3JlcGwoIl9tbV8iLCBzY2FsZSkpICU+JQogICAgICAgICAgICAgIHNlbGVjdChwN19zdWJqLCBzY2FsZSwgc2NvcmUpICU+JQogICAgICAgICAgICAgIG11dGF0ZShwN19jdHJ5ID0gIk9WRVJBTEwiKSAlPiUKICAgICAgICAgICAgICBncm91cF9ieShwN19jdHJ5KSAlPiUKICAgICAgICAgICAgICBzcHJlYWQoc2NhbGUsIHNjb3JlKSAlPiUKICAgICAgICAgICAgICBzdW1tYXJpc2UoCiAgICAgICAgICAgICAgICBwb3JfdG90YWwuc2VfdG90YWwgPSBjb3IocDdfbW1fdG90YWwsIHA3X3NlX3RvdGFsKSwKICAgICAgICAgICAgICAgIHBvcl90b3RhbF9vdGhlci5zZV90b3RhbCA9IGNvcihwN19tbV90b3RhbF9vdGhlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwN19zZV90b3RhbCksCiAgICAgICAgICAgICAgICBwb3JfdG90YWxfcHVyZS5zZV90b3RhbCA9IGNvcihwN19tbV90b3RhbF9wdXJlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA3X3NlX3RvdGFsKSkpICU+JQogIGdhdGhlcihwYWlyLCByLCAtcDdfY3RyeSkgJT4lCiAgc2VwYXJhdGUocGFpciwgaW50byA9IGMoInYxIiwgInYyIiksIHNlcCA9ICJcXC4iKSAlPiUKICBtdXRhdGUocDdfY3RyeSA9IGZhY3RvcihwN19jdHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgIkNoaW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYW51YXR1IiwgIk9WRVJBTEwiKSkpICU+JQogIHJlbmFtZShzYW1wbGUgPSBwN19jdHJ5KQpgYGAKCkhvd2V2ZXIsIGlzIHRoaXMgYSBfbWVhbmluZ2Z1bF8gc2ltaWxhcml0eT8gVG8gcmVwZWF0IGZyb20gUXVlc3Rpb25zICMxLTIsIGFib3ZlOiBhbiBpbXBvcnRhbnQgdGhpbmcgdG8ga2VlcCBpbiBtaW5kIGlzIHRoYXQgdGhlIHJlbGlhYmlsaXR5IG9mIGEgc2NhbGUgKGhvdyBzdHJvbmdseSBpdHMgaXRlbXMgYXJlIGNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyKSBhZmZlY3RzIGhvdyBzdHJvbmdseSBjb3JyZWxhdGVkIHRoZSB0b3RhbCBzY2FsZSBjYW4gYmUgd2l0aCBvdGhlciBtZWFzdXJlcy4gQSByb3VnaCBydWxlIG9mIHRodW1iIGlzIHRoYXQgdGhlIHJlbGlhYmlsaXR5IG9mIGEgc2NhbGUgc2V0cyBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhhdCBzY2FsZSBhbmQgb3RoZXJzLiBTaW5jZSB0aGVzZSB0d28gc3Vic2V0cyBvZiBNYXJ0aGEgU3RvcnkgYXJlIGtpbmQgb2YgYWQtaG9jIChhbmQgZGVmaW5pdGVseSBwb3N0LWhvYykgYnJlYWtkb3ducyBvZiBhIHByZS1leGlzdGluZyBzY2FsZSwgdGhpcyBzZWVtcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byBjaGVjayBoZXJlLgoKV2l0aCB0aGlzIGluIG1pbmQsIGxldCdzIGNoZWNrIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgdHdvIHN1YnNldHMgb2YgdGhlIE1hcnRoYSBTdG9yeSBzY2FsZSwgYW5kIGxvb2sgYXQgaG93IHRoZXNlIGNvcnJlbGF0aW9ucyB3aXRoIFNwaXJpdHVhbCBFdmVudHMgc3RhY2sgdXAgdG8gdGhlIHVwcGVyIGxpbWl0IGltcG9zZWQgYnkgcmVsaWFiaWxpdHkuLi4gYW5kIGp1c3QgZm9yIGZ1biBJJ2xsIHRocm93IGluIHRoZSBjb3JyZWxhdGlvbnMgd2l0aGluIGVhY2ggc2l0ZSBhcyB3ZWxsLgoKYGBge3J9CmRfYWxwaGEgPC0gZGF0YS5mcmFtZSgKICBgTWFydGhhIFN0b3J5IChhbGwgaXRlbXMpYCA9IGFscGhhX2J5X2N0cnlfZnVuKAogICAgZDAgJT4lIHNlbGVjdChwN19jdHJ5LCBjb250YWlucygiX21tXyIpKSksCiAgYE1hcnRoYSBTdG9yeSAob3RoZXIpYCA9IGFscGhhX2J5X2N0cnlfZnVuKAogICAgZDAgJT4lIHNlbGVjdChwN19jdHJ5LCBjb250YWlucygiX21tXyIpKSAlPiUKICAgICAgc2VsZWN0KC1jKHA3X21tX2FuZ190aGdzLmh1cnQsIHA3X21tX2FuZ19zaWNrbmVzcywgIyBxMWIsIDFlCiAgICAgICAgICAgICAgICBwN19tbV9jYXJfdGhrLm5vLnByLCBwN19tbV9jYXJfY3VyaW5nLCAjIHEyYiwgMmUKICAgICAgICAgICAgICAgIHA3X21tX2Vudl90aGdzLmh1cnQsIHA3X21tX2Vudl9zaWNrbmVzcykpKSwgIyBxM2IsIDNlCiAgYE1hcnRoYSBTdG9yeSAocHVyZSlgID0gYWxwaGFfYnlfY3RyeV9mdW4oCiAgICBkMCAlPiUgc2VsZWN0KHA3X2N0cnksIAogICAgICAgICAgICAgICAgICBwN19tbV9hbmdfdGhncy5odXJ0LCBwN19tbV9hbmdfc2lja25lc3MsICMgcTFiLCAxZQogICAgICAgICAgICAgICAgICBwN19tbV9jYXJfdGhrLm5vLnByLCBwN19tbV9jYXJfY3VyaW5nLCAjIHEyYiwgMmUKICAgICAgICAgICAgICAgICAgcDdfbW1fZW52X3RoZ3MuaHVydCwgcDdfbW1fZW52X3NpY2tuZXNzKSkpICU+JSAjIHEzYiwgM2UKICByb3duYW1lc190b19jb2x1bW4oInNhbXBsZSIpICU+JQogIGdhdGhlcihzY2FsZSwgcmF3X2FscGhhLCAtc2FtcGxlKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gCiAgICAgICAgICAgcmVjb2RlX2ZhY3Rvcihnc3ViKCJhbHBoYV8iLCAiIiwgc2FtcGxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJ1cyIgPSAiVVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgImdoIiA9ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAidGgiID0gIlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJjaCIgPSAiQ2hpbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgInZ0IiA9ICJWYW51YXR1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICJhbGwiID0gIk9WRVJBTEwiKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJcXC5cXC4kIiwgIikiLCBzY2FsZSksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiXFwuXFwuIiwgIiAoIiwgc2NhbGUpLAogICAgICAgICBzY2FsZSA9IGdzdWIoIlxcLiQiLCAiKSIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJcXC4iLCAiICIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCJcXCggIiwgIlxcKFxcIyIsIHNjYWxlKSwKICAgICAgICAgc2NhbGUgPSBnc3ViKCIxIDEzIiwgIjEtMTMiLCBzY2FsZSksCiAgICAgICAgIHNjYWxlID0gZ3N1YigiMTQgMjEiLCAiMTQtMjEiLCBzY2FsZSkpICU+JQogIG11dGF0ZShzY2FsZSA9IGZhY3RvcihzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTWFydGhhIFN0b3J5IChhbGwgaXRlbXMpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnRoYSBTdG9yeSAob3RoZXIpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnRoYSBTdG9yeSAocHVyZSkiKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjQsIGluY2x1ZGUgPSBUfQpkX2FscGhhICU+JQogIG11dGF0ZShzY29wZSA9IGlmZWxzZShzYW1wbGUgPT0gIk9WRVJBTEwiLCAic2l0ZSIsICJvdmVyYWxsIikpICU+JQogIGdncGxvdChhZXMoeCA9IHNhbXBsZSwgeSA9IHJhd19hbHBoYSwgIGNvbG9yID0gc2FtcGxlLCAKICAgICAgICAgICAgIHNoYXBlID0gc2NvcGUsIHNpemUgPSBzY29wZSkpICsKICBmYWNldF93cmFwKH4gc2NhbGUsIG5jb2wgPSA2KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC44LCBsdHkgPSAyKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjcsIGx0eSA9IDIsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBjb3JfcTRfYnlzaXRlICU+JQogICAgICAgICAgICAgICBtdXRhdGUoc2NvcGUgPSBpZmVsc2Uoc2FtcGxlID09ICJPVkVSQUxMIiwgInNpdGUiLCAib3ZlcmFsbCIpKSAlPiUKICAgICAgICAgICAgICAgcmVuYW1lKHNjYWxlID0gdjEpICU+JQogICAgICAgICAgICAgICBtdXRhdGUoc2NhbGUgPSByZWNvZGVfZmFjdG9yKAogICAgICAgICAgICAgICAgIHNjYWxlLAogICAgICAgICAgICAgICAgICJwb3JfdG90YWwiID0gIk1hcnRoYSBTdG9yeSAoYWxsIGl0ZW1zKSIsCiAgICAgICAgICAgICAgICAgInBvcl90b3RhbF9vdGhlciIgPSAiTWFydGhhIFN0b3J5IChvdGhlcikiLAogICAgICAgICAgICAgICAgICJwb3JfdG90YWxfcHVyZSIgPSAiTWFydGhhIFN0b3J5IChwdXJlKSIpKSwKICAgICAgICAgICAgIGFlcyh5ID0gciksIHNoYXBlID0gOSxzaG93LmxlZ2VxdWVzdGluZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDIsIDQpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsIDE4KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjEsIDEpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJSZWxpYWJpbGl0eSBieSBzaXRlIGFuZCBvdmVyYWxsLCBhbmQgY29ycmVsYXRpb25zIHdpdGggU3Bpcml0dWFsIEV2ZW50cyBzY2FsZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJTb2xpZCBkb3RzIGFyZSByZWxpYWJpbGl0eSAoQ3JvbmJhY2gncyBhbHBoYSkgZm9yIGVhY2ggc2NhbGUvc3Vic2NhbGUgKGFscGhhID0gMC44IGlzIGEgY2xhc3NpYyBjdXRvZmYgZm9yICdnb29kJyByZWxpYWJpbGl0eSlcbkNyb3NzLWhhdGNoZXMgYXJlIGNvcnJlbGF0aW9ucyB3aXRoIFNwaXJpdHVhbCBFdmVudHMsIHdoaWNoIGluIHRoZW9yeSBhcmUgY2FwcGVkIGF0IHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgdHdvIHNjYWxlcyBpbnZvbHZlZCIsCiAgICAgICB4ID0gIlNpdGUiLCB5ID0gIkNyb25iYWNoJ3MgYWxwaGEgKHJhbmdlOiAwLTEpXG5PUiBQZWFyc29uJ3MgciAocmFuZ2U6IC0xIHRvICsxKSIpCmBgYAoKVGhlIHNvbGlkIGRvdHMgaW4gdGhlc2UgcGxvdHMgaWxsdXN0cmF0ZSB0aGF0IHRoZSBwdXJlIE1hcnRoYSBTdG9yeSBpdGVtcyAocmlnaHRtb3N0IHBhbmVsKSBhbmQgdGhlIG90aGVyIE1hcnRoYSBTdG9yeSBpdGVtcyAoY2VudGVyKSBmb3JtZWQgcm91Z2hseSBlcXVhbGx5IHJlbGlhYmxlICJzY2FsZXMuIiBUaHVzLCBpbiBwcmluY2lwbGUsIGNvcnJlbGF0aW9ucyB3aXRoIFNwaXJpdHVhbCBFdmVudHMgY291bGQgYmUgZXF1YWxseSBzdHJvbmcgZm9yIHRoZSB0d28gc3Vic2V0cyBvZiBNYXJ0aGEgU3RvcnkgaXRlbXMuCgpJbiB0aGlzIGxpZ2h0LCBJIGZlZWwgcHJldHR5IGNvbmZpZGVuY2Ugc2F5aW5nIHRoYXQgdGhlICJwdXJlIiBNYXJ0aGEgU3RvcnkgaXRlbXMgd2VyZSBqdXN0IGFzIGdvb2QgYXQgInByZWRpY3RpbmciIFNwaXJpdHVhbCBFdmVudHMgYXMgd2VyZSB0aGUgb3RoZXIgTWFydGhhIFN0b3J5IGl0ZW1zLgoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPktBUkEnUyBDVVJSRU5UIFRBS0UtQVdBWTogQm90aCBzdWJzZXRzIG9mIE1hcnRoYSBTdG9yeSBpdGVtcyB3ZXJlIGVxdWFsbHkgY29ycmVsYXRlZCB3aXRoIFNwaXJpdHVhbCBFdmVudHMuPC9zcGFuPgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyBRdWVzdGlvbiAjNTogRm9jdXNpbmcgcmVsaWdpb3NpdHkgJiBwb3Jvc2l0eQoKVGFueWEncyBxdWVzdGlvbjogX0FyZSB0aGVyZSBoaWdobHkgcmVsaWdpb3VzIHBlb3BsZSAoYXMgbWFya2VkIGluIGRlbW9ncmFwaGljcykgd2hvIGRvIG5vdCBlbmRvcnNlIHBvcm9zaXR5IGhpZ2hseSBhbmQgdGhlIHJldmVyc2U/IGUuZy4sIGNhbiB3ZSBwbG90IHRoZSBob3cgc3Bpcml0dWFsL3JlbGlnaW91cyBhZ2FpbnN0IE1hcnRoYSBNYXJ5IGFuZCBhbHNvIGFnYWluc3QgRHVsaW4/XwoKVG8gYWRkcmVzcyB0aGlzLCBJJ2xsIHBsb3Qgc2VsZi1yZXBvcnRlZCByZWxpZ2lvc2l0eSBhZ2FpbnN0IHNjb3JlcyBvbiBib3RoIHBvcm9zaXR5IG1lYXN1cmVzLgoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjMsIGluY2x1ZGUgPSBUfQpkMCAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgcDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHA3X3Bvcl90b3RhbCwgcDdfbW1fdG90YWwpICU+JQogIGdhdGhlcihwb3Jfc2NhbGUsIHNjb3JlLCBjb250YWlucygidG90YWwiKSkgJT4lCiAgbXV0YXRlKHBvcl9zY2FsZSA9IHJlY29kZV9mYWN0b3IocG9yX3NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwN19wb3JfdG90YWwiID0gIlBvcm9zaXR5IChEdWxpbikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwN19tbV90b3RhbCIgPSAiTWFydGhhIFN0b3J5IikpICU+JQogIGZpbHRlcihwb3Jfc2NhbGUgPT0gIlBvcm9zaXR5IChEdWxpbikiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwN19kZW1faG93LnNwcnQucmVsZywgeSA9IHNjb3JlLCBjb2xvciA9IHA3X2N0cnkpKSArCiAgZmFjZXRfd3JhcCh+IHA3X2N0cnksIG5jb2wgPSA1KSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IC0xLjUsIHltaW4gPSAyNCwgeW1heCA9IEluZiwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgbHR5ID0gMikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDEuNSwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSA4LAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAyKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjEsc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJTZWxmLXJlcG9ydGVkIHJlbGlnaW9zaXR5IHZzLiBQb3Jvc2l0eSAoRHVsaW4pIHNjb3JlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJObyBzdGFuZGFyZGl6YXRpb24iLAogICAgICAgeCA9ICInSSBjb25zaWRlciBteXNlbGYgYSByZWxpZ2lvdXMgb3Igc3Bpcml0dWFsIHBlcnNvbi4nIiwKICAgICAgIHkgPSAiU2NvcmUiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC4zLCBpbmNsdWRlID0gVH0KZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIHA3X2RlbV9ob3cuc3BydC5yZWxnLCBwN19wb3JfdG90YWwsIHA3X21tX3RvdGFsKSAlPiUKICBnYXRoZXIocG9yX3NjYWxlLCBzY29yZSwgY29udGFpbnMoInRvdGFsIikpICU+JQogIG11dGF0ZShwb3Jfc2NhbGUgPSByZWNvZGVfZmFjdG9yKHBvcl9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfcG9yX3RvdGFsIiA9ICJQb3Jvc2l0eSAoRHVsaW4pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfbW1fdG90YWwiID0gIk1hcnRoYSBTdG9yeSIpKSAlPiUKICBmaWx0ZXIocG9yX3NjYWxlICE9ICJQb3Jvc2l0eSAoRHVsaW4pIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHkgPSBzY29yZSwgY29sb3IgPSBwN19jdHJ5KSkgKwogIGZhY2V0X3dyYXAofiBwN19jdHJ5LCBuY29sID0gNSkgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSAtMS41LCB5bWluID0gNDAuNSwgeW1heCA9IEluZiwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgbHR5ID0gMikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDEuNSwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSAxMy41LAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAyKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjEsc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJTZWxmLXJlcG9ydGVkIHJlbGlnaW9zaXR5IHZzLiBNYXJ0aGEgU3Rvcnkgc2NvcmVzIiwKICAgICAgIHN1YnRpdGxlID0gIk5vIHN0YW5kYXJkaXphdGlvbiIsCiAgICAgICB4ID0gIidJIGNvbnNpZGVyIG15c2VsZiBhIHJlbGlnaW91cyBvciBzcGlyaXR1YWwgcGVyc29uLiciLAogICAgICAgeSA9ICJTY29yZSIpCmBgYAoKV2UncmUgbG9va2luZyBmb3IgdHdvIHRoaW5ncyBoZXJlOgoKMS4gUGFydGljaXBhbnRzIHdobyBzY29yZWQgaGlnaCBvbiByZWxpZ2lvc2l0eSBidXQgbG93IG9uIHBvcm9zaXR5IChpLmUuLCBwb2ludHMgaW4gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lcikuIAoyLiBQZW9wbGUgd2hvIHNjb3JlZCBsb3cgb24gcmVsaWdpb3NpdHkgYnV0IGhpZ2ggb24gcG9yb3NpdHkgKGkuZS4sIHBvaW50cyBpbiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIpLiAKCkkndmUgYm94ZWQgb2ZmIHRoZSByZWdpb25zIHRoYXQgd291bGQgY29udGFpbiAoMSkgcGFydGljaXBhbnRzIHdobyBzY29yZWQgMiBvbiAgcmVsaWdpb3NpdHkgYW5kIDw9IDI1JSBvZiB0aGUgdG90YWwgcG9zc2libGUgc2NvcmUgZm9yIHBvcm9zaXR5LCBhbmQgKDIpIHBhcnRpY2lwYW50cyB3aG8gc2NvcmVkIC0yIGZvciByZWxpZ2lvc2l0eSBhbmQgPj0gNzUlIG9mIHRoZSB0b3RhbCBwb3NpYmxlIHNjb3JlIGZvciBwb3Jvc2l0eS4gVGhlcmUgYXJlIHZlcnkgZmV3IHBhcnRpY2lwYW50cyBpbiB0aGVzZSByZWdpb25zIGluIGFueSBzaXRlLgoKYGBge3IsIGluY2x1ZGUgPSBUfQpkMCAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgcDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHA3X3Bvcl90b3RhbCwgcDdfbW1fdG90YWwpICU+JQogIG11dGF0ZShoUmxQID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnID49IDIgJiBwN19wb3JfdG90YWwgPD0gOCksCiAgICAgICAgIGhSbE1NID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnID49IDIgJiBwN19tbV90b3RhbCA8PSAxMy41KSwKICAgICAgICAgbFJoUCA9IChwN19kZW1faG93LnNwcnQucmVsZyA8PSAtMiAmIHA3X3Bvcl90b3RhbCA+PSAyNCksCiAgICAgICAgIGxSaE1NID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnIDw9IC0yICYgcDdfbW1fdG90YWwgPj0gNDAuNSkpICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBoUmxQLCBoUmxNTSwgbFJoUCwgbFJoTU0pICU+JQogIGdhdGhlcih1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUsIC1jKHA3X2N0cnksIHA3X3N1YmopKSAlPiUKICBjb3VudChwN19jdHJ5LCB1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUpICU+JQogIGNvbXBsZXRlKHVudXN1YWxfdHlwZSwgdW51c3VhbF9zY29yZSwgZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBncm91cF9ieShwN19jdHJ5KSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKHVudXN1YWxfc2NvcmUpICU+JQogIG11dGF0ZShuX3Byb3AgPSBwYXN0ZTAobiwgIiAoIiwgcm91bmQocHJvcCwgMykgKiAxMDAsICIlKSIpKSAlPiUKICBzZWxlY3QoLWModW51c3VhbF9zY29yZSwgbiwgcHJvcCkpICU+JQogIGNvbXBsZXRlKHA3X2N0cnksIHVudXN1YWxfdHlwZSwgZmlsbCA9IGxpc3Qobl9wcm9wID0gIjAiKSkgJT4lCiAgc3ByZWFkKHVudXN1YWxfdHlwZSwgbl9wcm9wKSAlPiUKICBzZWxlY3QocDdfY3RyeSwgaFJsUCwgaFJsTU0sIGxSaFAsIGxSaE1NKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHA3X2N0cnkpKSAlPiUKICByZW5hbWUoU2l0ZSA9IHA3X2N0cnksCiAgICAgICAgIGBIaWdoIHJlbGlnaW9zaXR5LCBsb3cgUG9yb3NpdHkgKER1bGluKWAgPSBoUmxQLAogICAgICAgICBgSGlnaCByZWxpZ2lvc2l0eSwgbG93IE1hcnRoYSBTdG9yeWAgPSBoUmxNTSwKICAgICAgICAgYExvdyByZWxpZ2lvc2l0eSwgaGlnaCBQb3Jvc2l0eSAoRHVsaW4pYCA9IGxSaFAsCiAgICAgICAgIGBMb3cgcmVsaWdpb3NpdHksIGhpZ2ggTWFydGhhIFN0b3J5YCA9IGxSaE1NKSAlPiUKICBrYWJsZShjYXB0aW9uID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMgd2l0aCB1bnVzdWFsIGNvbWJpbmF0aW9ucyBvZiByZWxpZ2lvc2l0eSBhbmQgcG9yb3NpdHkgc2NvcmVzLiAnSGlnaCcgY29ycmVzcG9uZHMgdG8gc2NvcmVzID49IDI1JSBvZiB0aGUgdG90YWwgcG9zc2libGUgc2NvcmU7ICdsb3cnIGNvcnJlc3BvbmRzIHRvIHNjb3JlcyA8PSAyNSUgb2YgdGhlIHRvdGFsIHBvc3NpYmxlIHNjb3JlLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKClJhdGhlciB0aGFuIHNldHRpbmcgYXJiaXRyYXJ5IGN1dG9mZnMgb2YgKy8tMiBvbiByZWxpZ2lvc2l0eSBhbmQgPD0yNSUgb3IgPj03NSUgb2YgdGhlIHRvdGFsIHBvc3NpYmxlIHNjb3JlIGZvciBwb3Jvc2l0eSwgd2UgY291bGQgYWxzbyBsb29rIGF0ICJvdXRsaWVycyIgd2hvIHNjb3JlZCBhIGNlcnRhaW4gYW1vdW50IGF3YXkgZnJvbSB0aGUgbWVhbiBvbiB0aGVzZSBtZWFzdXJlcy4gSSdsbCBkbyB0aGlzIHRocm91Z2ggc3RhbmRhcmRpemF0aW9uIC0gZmlyc3QsIGNvbGxhcHNpbmcgYWNyb3NzIHNpdGVzOyB0aGVuLCB3aXRoaW4gZWFjaCBzaXRlIGluZGl2aWR1YWxseS4KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41LCBpbmNsdWRlID0gVH0KZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIHA3X2RlbV9ob3cuc3BydC5yZWxnLCBwN19wb3JfdG90YWwsIHA3X21tX3RvdGFsKSAlPiUKICBtdXRhdGVfYXQodmFycyhwN19kZW1faG93LnNwcnQucmVsZywgcDdfcG9yX3RvdGFsLCBwN19tbV90b3RhbCksCiAgICAgICAgICAgIGZ1bnMoc2NhbGUoLiwgc2NhbGUgPSBUKSkpICU+JQogIGdhdGhlcihwb3Jfc2NhbGUsIHNjb3JlLCBjb250YWlucygidG90YWwiKSkgJT4lCiAgbXV0YXRlKHBvcl9zY2FsZSA9IHJlY29kZV9mYWN0b3IocG9yX3NjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwN19wb3JfdG90YWwiID0gIlBvcm9zaXR5IChEdWxpbikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwN19tbV90b3RhbCIgPSAiTWFydGhhIFN0b3J5IikpICU+JQogIGdncGxvdChhZXMoeCA9IHA3X2RlbV9ob3cuc3BydC5yZWxnLCB5ID0gc2NvcmUsIGNvbG9yID0gcDdfY3RyeSkpICsKICBmYWNldF9ncmlkKHBvcl9zY2FsZSB+IHA3X2N0cnkpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gLTEsIHltaW4gPSAxLCB5bWF4ID0gSW5mLAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAyKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMSwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSAtMSwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgbHR5ID0gMikgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4yLCB3aWR0aCA9IDAuMiwgaGVpZ2h0ID0gMCxzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIlNlbGYtcmVwb3J0ZWQgcmVsaWdpb3NpdHkgdnMuIHBvcm9zaXR5IHNjb3JlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJBZnRlciBzdGFuZGFyZGl6aW5nIChjb2xsYXBzaW5nIGFjcm9zcyBzaXRlcykiLAogICAgICAgeCA9ICInSSBjb25zaWRlciBteXNlbGYgYSByZWxpZ2lvdXMgb3Igc3Bpcml0dWFsIHBlcnNvbi4nIiwKICAgICAgIHkgPSAiU2NvcmUgb24gcG9yb3NpdHkgbWVhc3VyZSIpCmBgYAoKUGFyYWxsZWwgdG8gYWJvdmUsIEkndmUgYm94ZWQgb2ZmIHRoZSByZWdpb25zIHRoYXQgd291bGQgY29udGFpbiAoMSkgcGFydGljaXBhbnRzIHdobyBzY29yZWQgPj0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYWJvdmUgdGhlIG1lYW4gZm9yIHJlbGlnaW9zaXR5IGFuZCA8PSAxIHN0YW5kYXJkIGRldmlhdGlvbiBiZWxvdyB0aGUgbWVhbiBmb3IgcG9yb3NpdHksIGFuZCAoMikgcGFydGljaXBhbnRzIHdobyBzY29yZWQgPD0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYmVsb3cgdGhlIG1lYW4gZm9yIHJlbGlnaW9zaXR5IGFuZCA+PSAxIHN0YW5kYXJkIGRldmlhdGlvbiBhYm92ZSB0aGUgbWVhbiBmb3IgcG9yb3NpdHkuIFRoZXJlIGFyZSB2ZXJ5IGZldyBwYXJ0aWNpcGFudHMgaW4gdGhlc2UgcmVnaW9ucyBpbiBhbnkgc2l0ZS4KCmBgYHtyLCBpbmNsdWRlID0gVH0KZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIHA3X2RlbV9ob3cuc3BydC5yZWxnLCBwN19wb3JfdG90YWwsIHA3X21tX3RvdGFsKSAlPiUKICBtdXRhdGVfYXQodmFycyhwN19kZW1faG93LnNwcnQucmVsZywgcDdfcG9yX3RvdGFsLCBwN19tbV90b3RhbCksCiAgICAgICAgICAgIGZ1bnMoc2NhbGUoLiwgc2NhbGUgPSBUKSkpICU+JQogIG11dGF0ZShoUmxQID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnID49IDEgJiBwN19wb3JfdG90YWwgPD0gLTEpLAogICAgICAgICBoUmxNTSA9IChwN19kZW1faG93LnNwcnQucmVsZyA+PSAxICYgcDdfbW1fdG90YWwgPD0gLTEpLAogICAgICAgICBsUmhQID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnIDw9IC0xICYgcDdfcG9yX3RvdGFsID49IDEpLAogICAgICAgICBsUmhNTSA9IChwN19kZW1faG93LnNwcnQucmVsZyA8PSAtMSAmIHA3X21tX3RvdGFsID49IDEpKSAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgaFJsUCwgaFJsTU0sIGxSaFAsIGxSaE1NKSAlPiUKICBnYXRoZXIodW51c3VhbF90eXBlLCB1bnVzdWFsX3Njb3JlLCAtYyhwN19jdHJ5LCBwN19zdWJqKSkgJT4lCiAgY291bnQocDdfY3RyeSwgdW51c3VhbF90eXBlLCB1bnVzdWFsX3Njb3JlKSAlPiUKICBjb21wbGV0ZSh1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUsIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgZ3JvdXBfYnkocDdfY3RyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcih1bnVzdWFsX3Njb3JlKSAlPiUKICBtdXRhdGUobl9wcm9wID0gcGFzdGUwKG4sICIgKCIsIHJvdW5kKHByb3AsIDMpICogMTAwLCAiJSkiKSkgJT4lCiAgc2VsZWN0KC1jKHVudXN1YWxfc2NvcmUsIG4sIHByb3ApKSAlPiUKICBjb21wbGV0ZShwN19jdHJ5LCB1bnVzdWFsX3R5cGUsIGZpbGwgPSBsaXN0KG5fcHJvcCA9ICIwIikpICU+JQogIHNwcmVhZCh1bnVzdWFsX3R5cGUsIG5fcHJvcCkgJT4lCiAgc2VsZWN0KHA3X2N0cnksIGhSbFAsIGhSbE1NLCBsUmhQLCBsUmhNTSkgJT4lCiAgZmlsdGVyKCFpcy5uYShwN19jdHJ5KSkgJT4lCiAgcmVuYW1lKFNpdGUgPSBwN19jdHJ5LAogICAgICAgICBgSGlnaCByZWxpZ2lvc2l0eSwgbG93IFBvcm9zaXR5IChEdWxpbilgID0gaFJsUCwKICAgICAgICAgYEhpZ2ggcmVsaWdpb3NpdHksIGxvdyBNYXJ0aGEgU3RvcnlgID0gaFJsTU0sCiAgICAgICAgIGBMb3cgcmVsaWdpb3NpdHksIGhpZ2ggUG9yb3NpdHkgKER1bGluKWAgPSBsUmhQLAogICAgICAgICBgTG93IHJlbGlnaW9zaXR5LCBoaWdoIE1hcnRoYSBTdG9yeWAgPSBsUmhNTSkgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIHdpdGggdW51c3VhbCBjb21iaW5hdGlvbnMgb2YgcmVsaWdpb3NpdHkgYW5kIHBvcm9zaXR5IHNjb3JlcyAoc3RhbmRhcmRpemluZyBjb2xsYXBzaW5nIGFjcm9zcyBzaXRlcykuICdIaWdoJyBjb3JyZXNwb25kcyB0byBzY29yZXMgPj0xIHN0YW5kYXJkIGRldmlhdGlvbiBhYm92ZSB0aGUgbWVhbiAoY29sbGFwc2luZyBhY3Jvc3Mgc2l0ZXMpOyAnbG93JyBjb3JyZXNwb25kcyB0byBzY29yZXMgPD0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYmVsb3cgdGhlIG1lYW4gKGNvbGxhcHNpbmcgYWNyb3NzIHNpdGVzKS4iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpXaGF0IGlmIHdlIHN0YW5kYXJkaXplIF93aXRoaW5fIGVhY2ggc2l0ZSwgc3VjaCB0aGF0IHdlJ3JlIGxvb2tpbmcgZm9yIHBhcnRpY2lwYW50cyB3aG8gc2NvcmVkIF9yZWxhdGl2ZWx5XyBoaWdoZXIvbG93ZXIgY29tcGFyZWQgdG8gb3RoZXIgcGVvcGxlIGluIHRoYXQgc2l0ZT8KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC4zLCBpbmNsdWRlID0gVH0KZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIHA3X2RlbV9ob3cuc3BydC5yZWxnLCBwN19wb3JfdG90YWwsIHA3X21tX3RvdGFsKSAlPiUKICBncm91cF9ieShwN19jdHJ5KSAlPiUKICBtdXRhdGVfYXQodmFycyhwN19kZW1faG93LnNwcnQucmVsZywgcDdfcG9yX3RvdGFsLCBwN19tbV90b3RhbCksCiAgICAgICAgICAgIGZ1bnMoc2NhbGUoLiwgc2NhbGUgPSBUKSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBnYXRoZXIocG9yX3NjYWxlLCBzY29yZSwgY29udGFpbnMoInRvdGFsIikpICU+JQogIG11dGF0ZShwb3Jfc2NhbGUgPSByZWNvZGVfZmFjdG9yKHBvcl9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfcG9yX3RvdGFsIiA9ICJQb3Jvc2l0eSAoRHVsaW4pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfbW1fdG90YWwiID0gIk1hcnRoYSBTdG9yeSIpKSAlPiUKICBmaWx0ZXIocG9yX3NjYWxlID09ICJQb3Jvc2l0eSAoRHVsaW4pIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHkgPSBzY29yZSwgY29sb3IgPSBwN19jdHJ5KSkgKwogIGZhY2V0X3dyYXAofiBwN19jdHJ5LCBuY29sID0gNSwgc2NhbGVzID0gImZyZWUiKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IC0xLCB5bWluID0gMSwgeW1heCA9IEluZiwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgbHR5ID0gMikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDEsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gLTEsCiAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIGx0eSA9IDIpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMiwgd2lkdGggPSAwLjEsIGhlaWdodCA9IDAuMSxzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIlNlbGYtcmVwb3J0ZWQgcmVsaWdpb3NpdHkgdnMuIFBvcm9zaXR5IChEdWxpbikgc2NvcmVzIiwKICAgICAgIHN1YnRpdGxlID0gIkFmdGVyIHN0YW5kYXJkaXppbmcgd2l0aGluIGVhY2ggc2l0ZSIsCiAgICAgICB4ID0gIidJIGNvbnNpZGVyIG15c2VsZiBhIHJlbGlnaW91cyBvciBzcGlyaXR1YWwgcGVyc29uLiciLAogICAgICAgeSA9ICJTY29yZSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjN9CmQwICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBwN19kZW1faG93LnNwcnQucmVsZywgcDdfcG9yX3RvdGFsLCBwN19tbV90b3RhbCkgJT4lCiAgZ3JvdXBfYnkocDdfY3RyeSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMocDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHA3X3Bvcl90b3RhbCwgcDdfbW1fdG90YWwpLAogICAgICAgICAgICBmdW5zKHNjYWxlKC4sIHNjYWxlID0gVCkpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ2F0aGVyKHBvcl9zY2FsZSwgc2NvcmUsIGNvbnRhaW5zKCJ0b3RhbCIpKSAlPiUKICBtdXRhdGUocG9yX3NjYWxlID0gcmVjb2RlX2ZhY3Rvcihwb3Jfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA3X3Bvcl90b3RhbCIgPSAiUG9yb3NpdHkgKER1bGluKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA3X21tX3RvdGFsIiA9ICJNYXJ0aGEgU3RvcnkiKSkgJT4lCiAgZmlsdGVyKHBvcl9zY2FsZSAhPSAiUG9yb3NpdHkgKER1bGluKSIpICU+JQogIGdncGxvdChhZXMoeCA9IHA3X2RlbV9ob3cuc3BydC5yZWxnLCB5ID0gc2NvcmUsIGNvbG9yID0gcDdfY3RyeSkpICsKICBmYWNldF93cmFwKH4gcDdfY3RyeSwgbmNvbCA9IDUsIHNjYWxlcyA9ICJmcmVlIikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSAtMSwgeW1pbiA9IDEsIHltYXggPSBJbmYsCiAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIGx0eSA9IDIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IC0xLAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAyKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjEsc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJTZWxmLXJlcG9ydGVkIHJlbGlnaW9zaXR5IHZzLiBNYXJ0aGEgU3Rvcnkgc2NvcmVzIiwKICAgICAgIHN1YnRpdGxlID0gIkFmdGVyIHN0YW5kYXJkaXppbmcgd2l0aGluIGVhY2ggc2l0ZSIsCiAgICAgICB4ID0gIidJIGNvbnNpZGVyIG15c2VsZiBhIHJlbGlnaW91cyBvciBzcGlyaXR1YWwgcGVyc29uLiciLAogICAgICAgeSA9ICJTY29yZSIpCmBgYAoKUGFyYWxsZWwgdG8gdGhlIHByZXZpb3VzIHBsb3QsIEkndmUgYm94ZWQgb2ZmIHRoZSByZWdpb25zIHRoYXQgd291bGQgY29udGFpbiAoMSkgcGFydGljaXBhbnRzIHdobyBzY29yZWQgPj0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYWJvdmUgdGhlIG1lYW4gX2ZvciB0aGF0IHNpdGVfIGZvciByZWxpZ2lvc2l0eSBhbmQgPD0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYmVsb3cgdGhlIG1lYW4gX2ZvciB0aGF0IHNpdGVfIGZvciBwb3Jvc2l0eSwgYW5kICgyKSBwYXJ0aWNpcGFudHMgd2hvIHNjb3JlZCA8PSAxIHN0YW5kYXJkIGRldmlhdGlvbiBiZWxvdyB0aGUgbWVhbiBfZm9yIHRoYXQgc2l0ZV8gZm9yIHJlbGlnaW9zaXR5IGFuZCA+PSAxIHN0YW5kYXJkIGRldmlhdGlvbiBhYm92ZSB0aGUgbWVhbiBfZm9yIHRoYXQgc2l0ZV8gZm9yIHBvcm9zaXR5LiBUaGVyZSBhcmUgdmVyeSBmZXcgcGFydGljaXBhbnRzIGluIHRoZXNlIHJlZ2lvbnMgaW4gYW55IHNpdGUuCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmQwICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBwN19kZW1faG93LnNwcnQucmVsZywgcDdfcG9yX3RvdGFsLCBwN19tbV90b3RhbCkgJT4lCiAgZ3JvdXBfYnkocDdfY3RyeSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMocDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHA3X3Bvcl90b3RhbCwgcDdfbW1fdG90YWwpLAogICAgICAgICAgICBmdW5zKHNjYWxlKC4sIHNjYWxlID0gVCkpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGhSbFAgPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPj0gMSAmIHA3X3Bvcl90b3RhbCA8PSAtMSksCiAgICAgICAgIGhSbE1NID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnID49IDEgJiBwN19tbV90b3RhbCA8PSAtMSksCiAgICAgICAgIGxSaFAgPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPD0gLTEgJiBwN19wb3JfdG90YWwgPj0gMSksCiAgICAgICAgIGxSaE1NID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnIDw9IC0xICYgcDdfbW1fdG90YWwgPj0gMSkpICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBoUmxQLCBoUmxNTSwgbFJoUCwgbFJoTU0pICU+JQogIGdhdGhlcih1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUsIC1jKHA3X2N0cnksIHA3X3N1YmopKSAlPiUKICBjb3VudChwN19jdHJ5LCB1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUpICU+JQogIGNvbXBsZXRlKHVudXN1YWxfdHlwZSwgdW51c3VhbF9zY29yZSwgZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBncm91cF9ieShwN19jdHJ5KSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKHVudXN1YWxfc2NvcmUpICU+JQogIG11dGF0ZShuX3Byb3AgPSBwYXN0ZTAobiwgIiAoIiwgcm91bmQocHJvcCwgMykgKiAxMDAsICIlKSIpKSAlPiUKICBzZWxlY3QoLWModW51c3VhbF9zY29yZSwgbiwgcHJvcCkpICU+JQogIGNvbXBsZXRlKHA3X2N0cnksIHVudXN1YWxfdHlwZSwgZmlsbCA9IGxpc3Qobl9wcm9wID0gIjAiKSkgJT4lCiAgc3ByZWFkKHVudXN1YWxfdHlwZSwgbl9wcm9wKSAlPiUKICBzZWxlY3QocDdfY3RyeSwgaFJsUCwgaFJsTU0sIGxSaFAsIGxSaE1NKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHA3X2N0cnkpKSAlPiUKICByZW5hbWUoU2l0ZSA9IHA3X2N0cnksCiAgICAgICAgIGBIaWdoIHJlbGlnaW9zaXR5LCBsb3cgUG9yb3NpdHkgKER1bGluKWAgPSBoUmxQLAogICAgICAgICBgSGlnaCByZWxpZ2lvc2l0eSwgbG93IE1hcnRoYSBTdG9yeWAgPSBoUmxNTSwKICAgICAgICAgYExvdyByZWxpZ2lvc2l0eSwgaGlnaCBQb3Jvc2l0eSAoRHVsaW4pYCA9IGxSaFAsCiAgICAgICAgIGBMb3cgcmVsaWdpb3NpdHksIGhpZ2ggTWFydGhhIFN0b3J5YCA9IGxSaE1NKSAlPiUKICBrYWJsZShjYXB0aW9uID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMgd2l0aCB1bnVzdWFsIGNvbWJpbmF0aW9ucyBvZiByZWxpZ2lvc2l0eSBhbmQgcG9yb3NpdHkgc2NvcmVzIChzdGFuZGFyZGl6aW5nIHdpdGhpbiBlYWNoIHNpdGUpLiAnSGlnaCcgY29ycmVzcG9uZHMgdG8gc2NvcmVzID49MSBzdGFuZGFyZCBkZXZpYXRpb24gYWJvdmUgdGhlIG1lYW4gKGZvciB0aGF0IHNpdGUpOyAnbG93JyBjb3JyZXNwb25kcyB0byBzY29yZXMgPD0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYmVsb3cgdGhlIG1lYW4gKGZvciB0aGF0IHNpdGUpLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5LQVJBJ1MgQ1VSUkVOVCBUQUtFLUFXQVk6IE5vIG1hdHRlciBob3cgd2UgbG9vayBhdCBpdCwgdGhlcmUgd2VyZSBqdXN0IGEgaGFuZGZ1bCBvZiBwZW9wbGUgKDwyJSBpbiBhbnkgc2l0ZSkgd2hvIGJ1Y2tlZCB0aGUgZ2VuZXJhbCB0cmVuZCB0aGF0IGVuZG9yc2VtZW50cyBvZiBwb3Jvc2l0eSBhcmUgcG9zaXRpdmVseSByZWxhdGVkIHRvIHNlbGYtcmVwb3J0ZWQgcmVsaWdpb3NpdHkuPC9zcGFuPgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyBRdWVzdGlvbiAjNjogRm9jdXNpbmcgb24gaGlnaGx5IHJlbGlnaW91cyBwZW9wbGUgJiBzcGlyaXR1YWwgZXhwZXJpZW5jZQoKVGFueWEncyBxdWVzdGlvbjogX1Bsb3QgaGlnaGx5IHJlbGlnaW91cyBwZW9wbGUgYWdhaW5zdCB0aGUgRFNFIGFuZCBhZ2FpbnN0IHRoZSBTcGlyaXR1YWwgRXZlbnRzIHNjYWxlP18KCk5PVEU6IEknbSBhc3N1bWluZyB0aGF0IHRoaXMgbWVhbnMgdG8gZG8gc29tZXRoaW5nIHNpbWlsYXIgdG8gUXVlc3Rpb24gIzUsIGJ1dCBJJ20gbm90IHN1cmUgaWYgdGhhdCB3YXMgdGhlIGludGVudGlvbi4KClRvIGFkZHJlc3MgdGhpcywgSSdsbCBwbG90IHNlbGYtcmVwb3J0ZWQgcmVsaWdpb3NpdHkgYWdhaW5zdCBzY29yZXMgb24gYm90aCBzcGlyaXR1YWwgZXhwZXJpZW5jZSBtZWFzdXJlcy4KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC4zLCBpbmNsdWRlID0gVH0KZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIHA3X2RlbV9ob3cuc3BydC5yZWxnLCBwN19kc2VfdG90YWwsIHA3X3NlX3RvdGFsKSAlPiUKICBnYXRoZXIoc3BleF9zY2FsZSwgc2NvcmUsIGNvbnRhaW5zKCJ0b3RhbCIpKSAlPiUKICBtdXRhdGUoc3BleF9zY2FsZSA9IHJlY29kZV9mYWN0b3Ioc3BleF9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfZHNlX3RvdGFsIiA9ICJEU0UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwN19zZV90b3RhbCIgPSAiU0UiKSkgJT4lCiAgZmlsdGVyKHNwZXhfc2NhbGUgPT0gIkRTRSIpICU+JQogIGdncGxvdChhZXMoeCA9IHA3X2RlbV9ob3cuc3BydC5yZWxnLCB5ID0gc2NvcmUsIGNvbG9yID0gcDdfY3RyeSkpICsKICBmYWNldF93cmFwKH4gcDdfY3RyeSwgbmNvbCA9IDUpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gLTEuNSwgeW1pbiA9IDUyLjUsIHltYXggPSBJbmYsCiAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIGx0eSA9IDIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxLjUsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gMTcuNSwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgbHR5ID0gMikgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4yLCB3aWR0aCA9IDAuMSwgaGVpZ2h0ID0gMC4xLHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiU2VsZi1yZXBvcnRlZCByZWxpZ2lvc2l0eSB2cy4gRFNFIHNjb3JlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJObyBzdGFuZGFyZGl6YXRpb24iLAogICAgICAgeCA9ICInSSBjb25zaWRlciBteXNlbGYgYSByZWxpZ2lvdXMgb3Igc3Bpcml0dWFsIHBlcnNvbi4nIiwKICAgICAgIHkgPSAiU2NvcmUiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC4zLCBpbmNsdWRlID0gVH0KZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIHA3X2RlbV9ob3cuc3BydC5yZWxnLCBwN19kc2VfdG90YWwsIHA3X3NlX3RvdGFsKSAlPiUKICBnYXRoZXIoc3BleF9zY2FsZSwgc2NvcmUsIGNvbnRhaW5zKCJ0b3RhbCIpKSAlPiUKICBtdXRhdGUoc3BleF9zY2FsZSA9IHJlY29kZV9mYWN0b3Ioc3BleF9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfZHNlX3RvdGFsIiA9ICJEU0UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwN19zZV90b3RhbCIgPSAiU0UiKSkgJT4lCiAgZmlsdGVyKHNwZXhfc2NhbGUgIT0gIkRTRSIpICU+JQogIGdncGxvdChhZXMoeCA9IHA3X2RlbV9ob3cuc3BydC5yZWxnLCB5ID0gc2NvcmUsIGNvbG9yID0gcDdfY3RyeSkpICsKICBmYWNldF93cmFwKH4gcDdfY3RyeSwgbmNvbCA9IDUpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gLTEuNSwgeW1pbiA9IDcyLCB5bWF4ID0gSW5mLAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAyKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMS41LCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDI0LAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAyKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjEsc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJTZWxmLXJlcG9ydGVkIHJlbGlnaW9zaXR5IHZzLiBTRSBzY29yZXMiLAogICAgICAgc3VidGl0bGUgPSAiTm8gc3RhbmRhcmRpemF0aW9uIiwKICAgICAgIHggPSAiJ0kgY29uc2lkZXIgbXlzZWxmIGEgcmVsaWdpb3VzIG9yIHNwaXJpdHVhbCBwZXJzb24uJyIsCiAgICAgICB5ID0gIlNjb3JlIikKYGBgCgpXZSdyZSBsb29raW5nIGZvciB0d28gdGhpbmdzIGhlcmU6CgoxLiBQYXJ0aWNpcGFudHMgd2hvIHNjb3JlZCBoaWdoIG9uIHJlbGlnaW9zaXR5IGJ1dCBsb3cgb24gc3Bpcml0dWFsIGV4cGVyaWVuY2UgKGkuZS4sIHBvaW50cyBpbiB0aGUgbG93ZXIgcmlnaHQgY29ybmVyKS4gCjIuIFBlb3BsZSB3aG8gc2NvcmVkIGxvdyBvbiByZWxpZ2lvc2l0eSBidXQgaGlnaCBvbiBzcGlyaXR1YWwgZXhwZXJpZW5jZSAoaS5lLiwgcG9pbnRzIGluIHRoZSB1cHBlciBsZWZ0IGNvcm5lcikuIAoKSSd2ZSBib3hlZCBvZmYgdGhlIHJlZ2lvbnMgdGhhdCB3b3VsZCBjb250YWluICgxKSBwYXJ0aWNpcGFudHMgd2hvIHNjb3JlZCAyIG9uICByZWxpZ2lvc2l0eSBhbmQgPD0gMjUlIG9mIHRoZSB0b3RhbCBwb3NzaWJsZSBzY29yZSBmb3Igc3Bpcml0dWFsIGV4cGVyaWVuY2UsIGFuZCAoMikgcGFydGljaXBhbnRzIHdobyBzY29yZWQgLTIgZm9yIHJlbGlnaW9zaXR5IGFuZCA+PSA3NSUgb2YgdGhlIHRvdGFsIHBvc2libGUgc2NvcmUgZm9yIHNwaXJpdHVhbCBleHBlcmllbmNlLiBUaGVyZSBhcmUgdmVyeSBmZXcgcGFydGljaXBhbnRzIGluIHRoZXNlIHJlZ2lvbnMgaW4gYW55IHNpdGUuCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmQwICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBwN19kZW1faG93LnNwcnQucmVsZywgcDdfZHNlX3RvdGFsLCBwN19zZV90b3RhbCkgJT4lCiAgbXV0YXRlKGhSbFAgPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPj0gMiAmIHA3X2RzZV90b3RhbCA8PSAxNy41KSwKICAgICAgICAgaFJsTU0gPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPj0gMiAmIHA3X3NlX3RvdGFsIDw9IDI0KSwKICAgICAgICAgbFJoUCA9IChwN19kZW1faG93LnNwcnQucmVsZyA8PSAtMiAmIHA3X2RzZV90b3RhbCA+PSA1Mi41KSwKICAgICAgICAgbFJoTU0gPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPD0gLTIgJiBwN19zZV90b3RhbCA+PSA3MikpICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBoUmxQLCBoUmxNTSwgbFJoUCwgbFJoTU0pICU+JQogIGdhdGhlcih1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUsIC1jKHA3X2N0cnksIHA3X3N1YmopKSAlPiUKICBjb3VudChwN19jdHJ5LCB1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUpICU+JQogIGNvbXBsZXRlKHVudXN1YWxfdHlwZSwgdW51c3VhbF9zY29yZSwgZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBncm91cF9ieShwN19jdHJ5KSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKHVudXN1YWxfc2NvcmUpICU+JQogIG11dGF0ZShuX3Byb3AgPSBwYXN0ZTAobiwgIiAoIiwgcm91bmQocHJvcCwgMykgKiAxMDAsICIlKSIpKSAlPiUKICBzZWxlY3QoLWModW51c3VhbF9zY29yZSwgbiwgcHJvcCkpICU+JQogIGNvbXBsZXRlKHA3X2N0cnksIHVudXN1YWxfdHlwZSwgZmlsbCA9IGxpc3Qobl9wcm9wID0gIjAiKSkgJT4lCiAgc3ByZWFkKHVudXN1YWxfdHlwZSwgbl9wcm9wKSAlPiUKICBzZWxlY3QocDdfY3RyeSwgaFJsUCwgaFJsTU0sIGxSaFAsIGxSaE1NKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHA3X2N0cnkpKSAlPiUKICByZW5hbWUoU2l0ZSA9IHA3X2N0cnksCiAgICAgICAgIGBIaWdoIHJlbGlnaW9zaXR5LCBsb3cgRFNFYCA9IGhSbFAsCiAgICAgICAgIGBIaWdoIHJlbGlnaW9zaXR5LCBsb3cgU0VgID0gaFJsTU0sCiAgICAgICAgIGBMb3cgcmVsaWdpb3NpdHksIGhpZ2ggRFNFYCA9IGxSaFAsCiAgICAgICAgIGBMb3cgcmVsaWdpb3NpdHksIGhpZ2ggU0VgID0gbFJoTU0pICU+JQogIGthYmxlKGNhcHRpb24gPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyB3aXRoIHVudXN1YWwgY29tYmluYXRpb25zIG9mIHJlbGlnaW9zaXR5IGFuZCBzcGlyaXR1YWwgZXhwZXJpZW5jZSBzY29yZXMuICdIaWdoJyBjb3JyZXNwb25kcyB0byBzY29yZXMgPj0gMjUlIG9mIHRoZSB0b3RhbCBwb3NzaWJsZSBzY29yZTsgJ2xvdycgY29ycmVzcG9uZHMgdG8gc2NvcmVzIDw9IDI1JSBvZiB0aGUgdG90YWwgcG9zc2libGUgc2NvcmUuIikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKUmF0aGVyIHRoYW4gc2V0dGluZyBhcmJpdHJhcnkgY3V0b2ZmcyBvZiArLy0yIG9uIHJlbGlnaW9zaXR5IGFuZCA8PTI1JSBvciA+PTc1JSBvZiB0aGUgdG90YWwgcG9zc2libGUgc2NvcmUgZm9yIHNwaXJpdHVhbCBleHBlcmllbmNlLCB3ZSBjb3VsZCBhbHNvIGxvb2sgYXQgIm91dGxpZXJzIiB3aG8gc2NvcmVkIGEgY2VydGFpbiBhbW91bnQgYXdheSBmcm9tIHRoZSBtZWFuIG9uIHRoZXNlIG1lYXN1cmVzLiBJJ2xsIGRvIHRoaXMgdGhyb3VnaCBzdGFuZGFyZGl6YXRpb24gLSBmaXJzdCwgY29sbGFwc2luZyBhY3Jvc3Mgc2l0ZXM7IHRoZW4sIHdpdGhpbiBlYWNoIHNpdGUgaW5kaXZpZHVhbGx5LgoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjUsIGluY2x1ZGUgPSBUfQpkMCAlPiUKICBzZWxlY3QocDdfY3RyeSwgcDdfc3ViaiwgcDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHA3X2RzZV90b3RhbCwgcDdfc2VfdG90YWwpICU+JQogIG11dGF0ZV9hdCh2YXJzKHA3X2RlbV9ob3cuc3BydC5yZWxnLCBwN19kc2VfdG90YWwsIHA3X3NlX3RvdGFsKSwKICAgICAgICAgICAgZnVucyhzY2FsZSguLCBzY2FsZSA9IFQpKSkgJT4lCiAgZ2F0aGVyKHNwZXhfc2NhbGUsIHNjb3JlLCBjb250YWlucygidG90YWwiKSkgJT4lCiAgbXV0YXRlKHNwZXhfc2NhbGUgPSByZWNvZGVfZmFjdG9yKHNwZXhfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA3X2RzZV90b3RhbCIgPSAiRFNFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfc2VfdG90YWwiID0gIlNFIikpICU+JQogIGdncGxvdChhZXMoeCA9IHA3X2RlbV9ob3cuc3BydC5yZWxnLCB5ID0gc2NvcmUsIGNvbG9yID0gcDdfY3RyeSkpICsKICBmYWNldF9ncmlkKHNwZXhfc2NhbGUgfiBwN19jdHJ5KSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IC0xLCB5bWluID0gMSwgeW1heCA9IEluZiwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgbHR5ID0gMikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDEsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gLTEsCiAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIGx0eSA9IDIpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMiwgd2lkdGggPSAwLjIsIGhlaWdodCA9IDAsc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJTZWxmLXJlcG9ydGVkIHJlbGlnaW9zaXR5IHZzLiBzcGlyaXR1YWwgZXhwZXJpZW5jZSBzY29yZXMiLAogICAgICAgc3VidGl0bGUgPSAiQWZ0ZXIgc3RhbmRhcmRpemluZyAoY29sbGFwc2luZyBhY3Jvc3Mgc2l0ZXMpIiwKICAgICAgIHggPSAiJ0kgY29uc2lkZXIgbXlzZWxmIGEgcmVsaWdpb3VzIG9yIHNwaXJpdHVhbCBwZXJzb24uJyIsCiAgICAgICB5ID0gIlNjb3JlIG9uIHNwaXJpdHVhbCBleHBlcmllbmNlIG1lYXN1cmUiKQpgYGAKClBhcmFsbGVsIHRvIGFib3ZlLCBJJ3ZlIGJveGVkIG9mZiB0aGUgcmVnaW9ucyB0aGF0IHdvdWxkIGNvbnRhaW4gKDEpIHBhcnRpY2lwYW50cyB3aG8gc2NvcmVkID49IDEgc3RhbmRhcmQgZGV2aWF0aW9uIGFib3ZlIHRoZSBtZWFuIGZvciByZWxpZ2lvc2l0eSBhbmQgPD0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYmVsb3cgdGhlIG1lYW4gZm9yIHNwaXJpdHVhbCBleHBlcmllbmNlLCBhbmQgKDIpIHBhcnRpY2lwYW50cyB3aG8gc2NvcmVkIDw9IDEgc3RhbmRhcmQgZGV2aWF0aW9uIGJlbG93IHRoZSBtZWFuIGZvciByZWxpZ2lvc2l0eSBhbmQgPj0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYWJvdmUgdGhlIG1lYW4gZm9yIHNwaXJpdHVhbCBleHBlcmllbmNlLiBUaGVyZSBhcmUgdmlydHVhbGx5IF9ub18gcGFydGljaXBhbnRzIGluIHRoZXNlIHJlZ2lvbnMgaW4gYW55IHNpdGUuCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmQwICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBwN19kZW1faG93LnNwcnQucmVsZywgcDdfZHNlX3RvdGFsLCBwN19zZV90b3RhbCkgJT4lCiAgbXV0YXRlX2F0KHZhcnMocDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHA3X2RzZV90b3RhbCwgcDdfc2VfdG90YWwpLAogICAgICAgICAgICBmdW5zKHNjYWxlKC4sIHNjYWxlID0gVCkpKSAlPiUKICBtdXRhdGUoaFJsUCA9IChwN19kZW1faG93LnNwcnQucmVsZyA+PSAxICYgcDdfZHNlX3RvdGFsIDw9IC0xKSwKICAgICAgICAgaFJsTU0gPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPj0gMSAmIHA3X3NlX3RvdGFsIDw9IC0xKSwKICAgICAgICAgbFJoUCA9IChwN19kZW1faG93LnNwcnQucmVsZyA8PSAtMSAmIHA3X2RzZV90b3RhbCA+PSAxKSwKICAgICAgICAgbFJoTU0gPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPD0gLTEgJiBwN19zZV90b3RhbCA+PSAxKSkgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIGhSbFAsIGhSbE1NLCBsUmhQLCBsUmhNTSkgJT4lCiAgZ2F0aGVyKHVudXN1YWxfdHlwZSwgdW51c3VhbF9zY29yZSwgLWMocDdfY3RyeSwgcDdfc3ViaikpICU+JQogIGNvdW50KHA3X2N0cnksIHVudXN1YWxfdHlwZSwgdW51c3VhbF9zY29yZSkgJT4lCiAgY29tcGxldGUodW51c3VhbF90eXBlLCB1bnVzdWFsX3Njb3JlLCBmaWxsID0gbGlzdChuID0gMCkpICU+JQogIGdyb3VwX2J5KHA3X2N0cnkpICU+JQogIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIodW51c3VhbF9zY29yZSkgJT4lCiAgbXV0YXRlKG5fcHJvcCA9IHBhc3RlMChuLCAiICgiLCByb3VuZChwcm9wLCAzKSAqIDEwMCwgIiUpIikpICU+JQogIHNlbGVjdCgtYyh1bnVzdWFsX3Njb3JlLCBuLCBwcm9wKSkgJT4lCiAgY29tcGxldGUocDdfY3RyeSwgdW51c3VhbF90eXBlLCBmaWxsID0gbGlzdChuX3Byb3AgPSAiMCIpKSAlPiUKICBzcHJlYWQodW51c3VhbF90eXBlLCBuX3Byb3ApICU+JQogIHNlbGVjdChwN19jdHJ5LCBoUmxQLCBoUmxNTSwgbFJoUCwgbFJoTU0pICU+JQogIGZpbHRlcighaXMubmEocDdfY3RyeSkpICU+JQogIHJlbmFtZShTaXRlID0gcDdfY3RyeSwKICAgICAgICAgYEhpZ2ggcmVsaWdpb3NpdHksIGxvdyBEU0VgID0gaFJsUCwKICAgICAgICAgYEhpZ2ggcmVsaWdpb3NpdHksIGxvdyBTRWAgPSBoUmxNTSwKICAgICAgICAgYExvdyByZWxpZ2lvc2l0eSwgaGlnaCBEU0VgID0gbFJoUCwKICAgICAgICAgYExvdyByZWxpZ2lvc2l0eSwgaGlnaCBTRWAgPSBsUmhNTSkgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIHdpdGggdW51c3VhbCBjb21iaW5hdGlvbnMgb2YgcmVsaWdpb3NpdHkgYW5kIHNwaXJpdHVhbCBleHBlcmllbmNlIHNjb3JlcyAoc3RhbmRhcmRpemluZyBjb2xsYXBzaW5nIGFjcm9zcyBzaXRlcykuICdIaWdoJyBjb3JyZXNwb25kcyB0byBzY29yZXMgPj0xIHN0YW5kYXJkIGRldmlhdGlvbiBhYm92ZSB0aGUgbWVhbiAoY29sbGFwc2luZyBhY3Jvc3Mgc2l0ZXMpOyAnbG93JyBjb3JyZXNwb25kcyB0byBzY29yZXMgPD0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYmVsb3cgdGhlIG1lYW4gKGNvbGxhcHNpbmcgYWNyb3NzIHNpdGVzKS4iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpXaGF0IGlmIHdlIHN0YW5kYXJkaXplIF93aXRoaW5fIGVhY2ggc2l0ZSwgc3VjaCB0aGF0IHdlJ3JlIGxvb2tpbmcgZm9yIHBhcnRpY2lwYW50cyB3aG8gc2NvcmVkIF9yZWxhdGl2ZWx5XyBoaWdoZXIvbG93ZXIgY29tcGFyZWQgdG8gb3RoZXIgcGVvcGxlIGluIHRoYXQgc2l0ZT8KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC4zLCBpbmNsdWRlID0gVH0KZDAgJT4lCiAgc2VsZWN0KHA3X2N0cnksIHA3X3N1YmosIHA3X2RlbV9ob3cuc3BydC5yZWxnLCBwN19kc2VfdG90YWwsIHA3X3NlX3RvdGFsKSAlPiUKICBncm91cF9ieShwN19jdHJ5KSAlPiUKICBtdXRhdGVfYXQodmFycyhwN19kZW1faG93LnNwcnQucmVsZywgcDdfZHNlX3RvdGFsLCBwN19zZV90b3RhbCksCiAgICAgICAgICAgIGZ1bnMoc2NhbGUoLiwgc2NhbGUgPSBUKSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBnYXRoZXIoc3BleF9zY2FsZSwgc2NvcmUsIGNvbnRhaW5zKCJ0b3RhbCIpKSAlPiUKICBtdXRhdGUoc3BleF9zY2FsZSA9IHJlY29kZV9mYWN0b3Ioc3BleF9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfZHNlX3RvdGFsIiA9ICJEU0UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwN19zZV90b3RhbCIgPSAiU0UiKSkgJT4lCiAgZmlsdGVyKHNwZXhfc2NhbGUgPT0gIkRTRSIpICU+JQogIGdncGxvdChhZXMoeCA9IHA3X2RlbV9ob3cuc3BydC5yZWxnLCB5ID0gc2NvcmUsIGNvbG9yID0gcDdfY3RyeSkpICsKICBmYWNldF93cmFwKH4gcDdfY3RyeSwgbmNvbCA9IDUsIHNjYWxlcyA9ICJmcmVlIikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSAtMSwgeW1pbiA9IDEsIHltYXggPSBJbmYsCiAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIGx0eSA9IDIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IC0xLAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAyKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjEsc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJTZWxmLXJlcG9ydGVkIHJlbGlnaW9zaXR5IHZzLiBEU0Ugc2NvcmVzIiwKICAgICAgIHN1YnRpdGxlID0gIkFmdGVyIHN0YW5kYXJkaXppbmcgd2l0aGluIGVhY2ggc2l0ZSIsCiAgICAgICB4ID0gIidJIGNvbnNpZGVyIG15c2VsZiBhIHJlbGlnaW91cyBvciBzcGlyaXR1YWwgcGVyc29uLiciLAogICAgICAgeSA9ICJTY29yZSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjN9CmQwICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBwN19kZW1faG93LnNwcnQucmVsZywgcDdfZHNlX3RvdGFsLCBwN19zZV90b3RhbCkgJT4lCiAgZ3JvdXBfYnkocDdfY3RyeSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMocDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHA3X2RzZV90b3RhbCwgcDdfc2VfdG90YWwpLAogICAgICAgICAgICBmdW5zKHNjYWxlKC4sIHNjYWxlID0gVCkpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ2F0aGVyKHNwZXhfc2NhbGUsIHNjb3JlLCBjb250YWlucygidG90YWwiKSkgJT4lCiAgbXV0YXRlKHNwZXhfc2NhbGUgPSByZWNvZGVfZmFjdG9yKHNwZXhfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInA3X2RzZV90b3RhbCIgPSAiRFNFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicDdfc2VfdG90YWwiID0gIlNFIikpICU+JQogIGZpbHRlcihzcGV4X3NjYWxlICE9ICJEU0UiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwN19kZW1faG93LnNwcnQucmVsZywgeSA9IHNjb3JlLCBjb2xvciA9IHA3X2N0cnkpKSArCiAgZmFjZXRfd3JhcCh+IHA3X2N0cnksIG5jb2wgPSA1LCBzY2FsZXMgPSAiZnJlZSIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gLTEsIHltaW4gPSAxLCB5bWF4ID0gSW5mLAogICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBsdHkgPSAyKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMSwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSAtMSwKICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgbHR5ID0gMikgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4yLCB3aWR0aCA9IDAuMSwgaGVpZ2h0ID0gMC4xLHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiU2VsZi1yZXBvcnRlZCByZWxpZ2lvc2l0eSB2cy4gU0Ugc2NvcmVzIiwKICAgICAgIHN1YnRpdGxlID0gIkFmdGVyIHN0YW5kYXJkaXppbmcgd2l0aGluIGVhY2ggc2l0ZSIsCiAgICAgICB4ID0gIidJIGNvbnNpZGVyIG15c2VsZiBhIHJlbGlnaW91cyBvciBzcGlyaXR1YWwgcGVyc29uLiciLAogICAgICAgeSA9ICJTY29yZSIpCmBgYAoKUGFyYWxsZWwgdG8gdGhlIHByZXZpb3VzIHBsb3QsIEkndmUgYm94ZWQgb2ZmIHRoZSByZWdpb25zIHRoYXQgd291bGQgY29udGFpbiAoMSkgcGFydGljaXBhbnRzIHdobyBzY29yZWQgPj0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYWJvdmUgdGhlIG1lYW4gX2ZvciB0aGF0IHNpdGVfIGZvciByZWxpZ2lvc2l0eSBhbmQgPD0gMSBzdGFuZGFyZCBkZXZpYXRpb24gYmVsb3cgdGhlIG1lYW4gX2ZvciB0aGF0IHNpdGVfIGZvciBzcGlyaXR1YWwgZXhwZXJpZW5jZSwgYW5kICgyKSBwYXJ0aWNpcGFudHMgd2hvIHNjb3JlZCA8PSAxIHN0YW5kYXJkIGRldmlhdGlvbiBiZWxvdyB0aGUgbWVhbiBfZm9yIHRoYXQgc2l0ZV8gZm9yIHJlbGlnaW9zaXR5IGFuZCA+PSAxIHN0YW5kYXJkIGRldmlhdGlvbiBhYm92ZSB0aGUgbWVhbiBfZm9yIHRoYXQgc2l0ZV8gZm9yIHNwaXJpdHVhbCBleHBlcmllbmNlLiBUaGVyZSBhcmUgdmVyeSBmZXcgcGFydGljaXBhbnRzIGluIHRoZXNlIHJlZ2lvbnMgaW4gYW55IHNpdGUuCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmQwICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBwN19kZW1faG93LnNwcnQucmVsZywgcDdfZHNlX3RvdGFsLCBwN19zZV90b3RhbCkgJT4lCiAgZ3JvdXBfYnkocDdfY3RyeSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMocDdfZGVtX2hvdy5zcHJ0LnJlbGcsIHA3X2RzZV90b3RhbCwgcDdfc2VfdG90YWwpLAogICAgICAgICAgICBmdW5zKHNjYWxlKC4sIHNjYWxlID0gVCkpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGhSbFAgPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPj0gMSAmIHA3X2RzZV90b3RhbCA8PSAtMSksCiAgICAgICAgIGhSbE1NID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnID49IDEgJiBwN19zZV90b3RhbCA8PSAtMSksCiAgICAgICAgIGxSaFAgPSAocDdfZGVtX2hvdy5zcHJ0LnJlbGcgPD0gLTEgJiBwN19kc2VfdG90YWwgPj0gMSksCiAgICAgICAgIGxSaE1NID0gKHA3X2RlbV9ob3cuc3BydC5yZWxnIDw9IC0xICYgcDdfc2VfdG90YWwgPj0gMSkpICU+JQogIHNlbGVjdChwN19jdHJ5LCBwN19zdWJqLCBoUmxQLCBoUmxNTSwgbFJoUCwgbFJoTU0pICU+JQogIGdhdGhlcih1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUsIC1jKHA3X2N0cnksIHA3X3N1YmopKSAlPiUKICBjb3VudChwN19jdHJ5LCB1bnVzdWFsX3R5cGUsIHVudXN1YWxfc2NvcmUpICU+JQogIGNvbXBsZXRlKHVudXN1YWxfdHlwZSwgdW51c3VhbF9zY29yZSwgZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBncm91cF9ieShwN19jdHJ5KSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKHVudXN1YWxfc2NvcmUpICU+JQogIG11dGF0ZShuX3Byb3AgPSBwYXN0ZTAobiwgIiAoIiwgcm91bmQocHJvcCwgMykgKiAxMDAsICIlKSIpKSAlPiUKICBzZWxlY3QoLWModW51c3VhbF9zY29yZSwgbiwgcHJvcCkpICU+JQogIGNvbXBsZXRlKHA3X2N0cnksIHVudXN1YWxfdHlwZSwgZmlsbCA9IGxpc3Qobl9wcm9wID0gIjAiKSkgJT4lCiAgc3ByZWFkKHVudXN1YWxfdHlwZSwgbl9wcm9wKSAlPiUKICBzZWxlY3QocDdfY3RyeSwgaFJsUCwgaFJsTU0sIGxSaFAsIGxSaE1NKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHA3X2N0cnkpKSAlPiUKICByZW5hbWUoU2l0ZSA9IHA3X2N0cnksCiAgICAgICAgIGBIaWdoIHJlbGlnaW9zaXR5LCBsb3cgRFNFYCA9IGhSbFAsCiAgICAgICAgIGBIaWdoIHJlbGlnaW9zaXR5LCBsb3cgU0VgID0gaFJsTU0sCiAgICAgICAgIGBMb3cgcmVsaWdpb3NpdHksIGhpZ2ggRFNFYCA9IGxSaFAsCiAgICAgICAgIGBMb3cgcmVsaWdpb3NpdHksIGhpZ2ggU0VgID0gbFJoTU0pICU+JQogIGthYmxlKGNhcHRpb24gPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyB3aXRoIHVudXN1YWwgY29tYmluYXRpb25zIG9mIHJlbGlnaW9zaXR5IGFuZCBzcGlyaXR1YWwgZXhwZXJpZW5jZSBzY29yZXMgKHN0YW5kYXJkaXppbmcgd2l0aGluIGVhY2ggc2l0ZSkuICdIaWdoJyBjb3JyZXNwb25kcyB0byBzY29yZXMgPj0xIHN0YW5kYXJkIGRldmlhdGlvbiBhYm92ZSB0aGUgbWVhbiAoZm9yIHRoYXQgc2l0ZSk7ICdsb3cnIGNvcnJlc3BvbmRzIHRvIHNjb3JlcyA8PSAxIHN0YW5kYXJkIGRldmlhdGlvbiBiZWxvdyB0aGUgbWVhbiAoZm9yIHRoYXQgc2l0ZSkuIikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPktBUkEnUyBDVVJSRU5UIFRBS0UtQVdBWTogTm8gbWF0dGVyIGhvdyB3ZSBsb29rIGF0IGl0LCB0aGVyZSB3ZXJlIGp1c3QgYSBoYW5kZnVsIG9mIHBlb3BsZSAoPDMlIGluIGFueSBzaXRlKSB3aG8gYnVja2VkIHRoZSBnZW5lcmFsIHRyZW5kIHRoYXQgZW5kb3JzZW1lbnRzIG9mIHNwaXJpdHVhbCBleHBlcmllbmNlIGFyZSBwb3NpdGl2ZWx5IHJlbGF0ZWQgdG8gc2VsZi1yZXBvcnRlZCByZWxpZ2lvc2l0eS48L3NwYW4+Cgo=